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 のすべての周波数を 1 つの半複素正弦波に結合することでエンコーダーがビット レートを達成できる場合は、そのようになります。
  • -32dB 未満のすべての信号を削除すればうまくいくのであれば、それで十分でしょう。

どのような情報が削除されるのかを現実的に説明するために、まずは以下を読むことをお勧めします。オーディオデータ圧縮に関するWikipediaの記事

関連情報