FFmpeg Bitstream Filters Documentation を注意深く読んだ後でも、私はそれらが本当に何のためにあるのかまだ理解していません。
このドキュメントでは、フィルタは次のように述べています。
デコードを実行せずにビットストリームレベルの変更を実行します
誰かがさらに私にそれを説明できますか?ユースケースは、物事を非常に明確にするでしょう。また、明らかに異なるフィルターがあります。それらはどう違うのですか?
例を挙げて説明します。 FFmpegビデオデコーダーは、通常、呼び出しごとに1つのビデオフレームをavcodec_decode_video2に変換することで機能します。したがって、入力はビットストリームデータの「1つの画像」に相当すると予想されます。ファイル(ディスクのバイトの配列)からイメージに1秒間移動するこの問題について考えてみましょう。
"raw"(annexb)H264(.h264/.bin/.264ファイル)の場合、個々のnalユニットデータ(sps/ppsヘッダービットストリームまたはcabacでエンコードされたフレームデータ)が一連のnalユニットに連結され、先頭に間にコード(00 00 01 XX)、XXは最終単位タイプ。 (最終データ自体が00 00 01データを持たないようにするために、RBSPエスケープされます。)したがって、 h264フレームパーサー は、開始コードマーカーでファイルを単純にカットできます。彼らは、00 00 01で始まり00 00 01が次に出現するまで、それを含む連続したパケットを検索します。次に、nalユニットタイプとスライスヘッダーを解析して、各パケットが属するフレームを見つけ、一連のnalを返します。 h264デコーダー への入力として1フレームを構成する単位。
ただし、.mp4ファイルのH264データは異なります。 mp4の場合のように、muxing形式にすでに長さマーカーが含まれている場合、00 00 01開始コードは冗長であると考えることができます。したがって、フレームごとに3バイトを節約するために、00 00 01プレフィックスを削除します。また、最初のフレームの前に付加するのではなく、PPS/SPSをファイルヘッダーに配置します。これらも、00 00 01プレフィックスがありません。したがって、これをすべてのnalユニットの接頭辞を想定しているh264デコーダーに入力すると、機能しません。 h264_mp4toannexb ビットストリームフィルターは、ファイルヘッダーの抽出部分のpps/sps(ffmpegがこれを「追加データ」と呼びます)を識別し、これと個々のフレームパケットの各nalの先頭に開始コードを付加することで、これを修正します、それらをh264デコーダに入力する前に連結します。
「パーサー」と「ビットストリームフィルター」の間には非常に細かな線の違いがあるように感じるかもしれません。これは本当です。正式な定義では、パーサーは入力データのシーケンスを取得し、データを破棄したりデータを追加したりせずにフレームに分割します。パーサーが行う唯一のことは、パケット境界を変更することです。一方、ビットストリームフィルターでは、実際にデータを変更できます。この定義が完全に正しいかどうかはわかりませんが(たとえば、以下のvp9を参照)、mp4toannexbがパーサーではなくBSFであるという概念上の理由です(00 00 01プレフィックスが追加されるため)。
このような「ビットストリームの微調整」がデコーダーをシンプルかつ均一に保つのに役立つ他のケースですが、実際に存在するすべてのファイルバリアントをサポートすることができます。