
我正在使用 MKV 作為容器將無損壓縮的視訊和音訊檔案 (Utvideo/LCPM) 轉換為 FFV1/FLAC 編解碼器,以節省儲存空間而不影響品質。我使用 ffmpeg 的framemd5 功能來確保每次轉換在輸出方面與原始捕獲的比例為 1:1。
批次腳本如下:
for %%a in ("*.avi") do ffmpeg -i "%%a" -f framemd5 "%%~na.framemd5"
但是,當使用 FLAC 作為音訊編解碼器時,framemd5 輸出的音訊部分不再匹配。
以下是範例記錄的 framemd5 的前 1001 行:
https://pastebin.com/axcf3f0a原始LPCM
https://pastebin.com/3n75YTMjFLAC 轉換
問題似乎在於FLAC 新增了額外的元資料及其自己的校驗和,因此雖然音訊應該是 1:1,但framemd5 無法辨識它。我不太熟悉 FLAC 的文件結構,因此我無法親自驗證這一點或提出解決方法。
有什麼辦法可以調和這個嗎?我可以建立framemd5 文件,將Utvideo/LPCM 和FFV1/FLAC 之間的視訊和音訊校驗和設為1:1 嗎?
這是令人難以置信的令人沮喪。我想使用 FLAC 來壓縮音頻,因為我已經在嘗試節省盡可能多的空間。
答案1
這與 FLAC 流的元資料無關。
ffmpeg-all
在影格哈希上(framemd5是framehash的變體):
預設情況下,在計算哈希之前,音頻幀會轉換為簽名的 16 位元原始音頻,視頻幀會轉換為原始視頻
(註:如果位元深度較高,則需要指定相應的編碼器, 例如-c:a pcm_s24le
後 -f framemd5
在「A 和 B」情況下,以避免對「截斷」音訊幀執行校驗和。
因此,除非您指定了類似-c copy
.因此,元資料不會「幹擾」此處的雜湊。
這裡問題的真正原因是,與視訊的情況不同,這裡的「幀」應用於音訊串流時不是指單一樣本,而是指分組為資料包的整體樣本。資料包可以具有不同的大小(樣本數量),具體取決於編碼器/復用器(其程式碼中的預設值),也可能取決於使用者的設定。
從輸出線可以看出,在 PCM 情況下,輸入音訊串流中的每個資料包都有 1024 個樣本,而在 FLAC 情況下,每個資料包都有 4608 個樣本。
TL;博士。這裡的解決方案是在對“壓縮版本”進行編碼-frame_size 1024
後添加。-c:a flac
PS 我不知道在任何情況下更改 FLAC 流的幀/數據包大小是否會導致任何問題(例如在播放中)/不良副作用,並且您可能想知道是否可以更改 FLAC 流的幀/數據包大小PCM 流代替。我只能說,就 PCM 而言,它將是複用器級別的東西,而不是像 FLAC 那樣的編碼器級別的東西,這或多或少意味著它不太可能是用戶可配置的。
雖然它可能有幫助,也可能沒有幫助,但您始終可以嘗試將其與另一個Matroska 混合(從原始流文件或WAVE/AIFF 文件(如果是PCM),而不是重新混合Matroska 文件,因為涉及的過程可能不同)復用器,以防1024
ffmpeg 中的 PCM-in-Matroksa 封包/幀大小(即 )在用於 FLAC 時無法正常工作。
更新:顯然,如果您使用 WAVE 檔案作為輸入,您可以使用-max_size
解復用器(WAVE dexmuer 的)選項來確定當流饋送到 Matrokska 復用器時每個資料包有多大。請注意,這-max_size
是以位元組為單位而不是樣本。所以在這種情況下你可以使用類似的東西ffmpeg ... -max_size 9216 -i path/to/input.wav ...
(確保你有-max_size
前 -i
)。我似乎沒有在原始 PCM 解復用器中看到類似的選項(例如s16le
),因此如果您需要使用它,則需要先將輸入音訊檔案設為 WAVE 檔案。
參考號(預設程式碼中的位置):
https://github.com/FFmpeg/FFmpeg/blob/n5.1.2/libavcodec/flacenc.c#L314
https://github.com/FFmpeg/FFmpeg/blob/n5.1.2/libavformat/pcm.c#L27
https://github.com/FFmpeg/FFmpeg/blob/n5.1.2/libavformat/wavdec.c#L76