使用 FFmpeg 轉換音訊時,有-ar
和-ac
選項,分別控制取樣率和通道數。它還提供-ab
控制位元率的選項,但沒有控制位元深度的選項。
自從…
[位元速率] = [通道數] * [取樣率] * [位元深度]
……這是否意味著 ffmpeg 根據其他 3 個參數計算位元深度?
另一個帖子說位元深度是在格式選項中控制的。這讓我很困惑,因為如果使用者設定了所有 4 個參數,上面的方程式可能不再成立。
誰能解釋一下 FFmpeg 中的位元深度和位元率如何運作?
答案1
至於可能性設定位元深度:這取決於您的原始檔案和輸出格式。
例如,takepcm_s16le
和pcm_s24le
- 都將渲染 PCM 文件,但分別具有 16 位元/24 位元的位元深度。 (您可以透過 找到此資訊ffmpeg -h encoder=<YOUR_ENCODER>
。)
如果您的格式可以採用多個位元深度(例如libmp3lame
),FFmpeg 預設將透過檢視來源檔案來指定使用的值:因此,如果您採用-c:a libmp3lame
且輸入檔案的位元深度為 16 位元,則 FFmpeg將使用16位。如果您有一個 32 位元檔案並且想要將其編碼為只能容納 16 位元的編解碼器,那麼 FFmpeg 將為您進行取樣。
但你也可以自己指定使用-sample_fmt
。
至於你的比特率公式:FFmpeg 與幾乎所有其他工具一樣,將音訊通道數、位元深度和取樣率視為固定值(意味著它們不會更改檔案內),而位元速率是與編碼的品質。然而,這只適用於有損編解碼器。這就是為什麼對 WAV 檔案重新編碼 200 次不會產生任何影響,而使用相當不錯的 MP3 編碼器對相同檔案重新編碼 20 次可能已經導致難以忍受的結果。
有損編解碼器會增加等式中的質量:例如,在 MP3 中, 的值320k
將實現非常好的質量,因為編碼器不必丟棄太多資訊即可保持在指定值內。如果您使用-b:a 64k
,編碼器將不得不丟棄許多資訊才能達到指定的位元率。編碼器將根據需要降低到達到位元率:非常瑣碎,因此只是可以刪除的資訊的理論範例:
- 如果將 8-16kHz 的所有頻率組合成一個半複數正弦波將使編碼器達到位元率,那麼它就會這樣做。
- 如果刪除所有低於 -32dB 的訊號就能解決問題,那就好了。
有關哪些資訊將被刪除的一些現實世界的解釋,我建議您首先閱讀維基百科關於音訊資料壓縮的文章。