FFmpeg 如何控制位元深和位元率?

FFmpeg 如何控制位元深和位元率?

使用 FFmpeg 轉換音訊時,有-ar-ac選項,分別控制取樣率和通道數。它還提供-ab控制位元率的選項,但沒有控制位元深度的選項。

自從…

[位元速率] = [通道數] * [取樣率] * [位元深度]

……這是否意味著 ffmpeg 根據其他 3 個參數計算位元深度?

另一個帖子說位元深度是在格式選項中控制的。這讓我很困惑,因為如果使用者設定了所有 4 個參數,上面的方程式可能不再成立。

誰能解釋一下 FFmpeg 中的位元深度和位元率如何運作?

答案1

至於可能性設定位元深度:這取決於您的原始檔案和輸出格式。

例如,takepcm_s16lepcm_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 的訊號就能解決問題,那就好了。

有關哪些資訊將被刪除的一些現實世界的解釋,我建議您首先閱讀維基百科關於音訊資料壓縮的文章

相關內容