web-dev-qa-db-ja.com

ffmpegのビットストリームフィルターとは何ですか?

FFmpeg Bitstream Filters Documentation を注意深く読んだ後でも、私はそれらが本当に何のためにあるのかまだ理解していません。

このドキュメントでは、フィルタは次のように述べています。

デコードを実行せずにビットストリームレベルの変更を実行します

誰かがさらに私にそれを説明できますか?ユースケースは、物事を非常に明確にするでしょう。また、明らかに異なるフィルターがあります。それらはどう違うのですか?

16
Joe

例を挙げて説明します。 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プレフィックスが追加されるため)。

このような「ビットストリームの微調整」がデコーダーをシンプルかつ均一に保つのに役立つ他のケースですが、実際に存在するすべてのファイルバリアントをサポートすることができます。

  • mpeg4(divx) b frame unpacking (IPBとしてコード化されているIBPのようなBフレームシーケンスをAVIで取得し、タイムスタンプを正しく取得するために、人々はIBPでこのBフレームパッキングの概念を思いつきました/ IPBはフレームに I-(PB)-() としてパックされます。つまり、3番目のパケットは空で、2番目のパケットには2つのフレームがあります。これは、デコード時にPおよびBフレームに関連付けられたタイムスタンプを意味しますフェーズは正しいです。これは、1つのパケットに2フレーム分の入力データがあることを意味します。これは、ffmpegの1フレームイン1フレームアウトの概念に違反しているため、パケットを2つに分割するbsfを作成しました。パケットを2つのフレーム、つまりパーサーではなくBSFが含まれていることを示すマーカーを削除します-デコーダーに入力する前に。これにより、フレームマルチスレッドに関する難しい問題が解決されます。VP9は同じことを行います(スーパーフレームと呼ばれます)。 parser でフレームを分割するため、パーサー/ BSF分割は常に理論的に完全であるとは限りません。おそらく、VP9はBSFと呼ばれるべきです)
  • hevc mp4からannexbへの変換(上記と同じですが、hevcの場合)
  • aac adts to asc 変換(これは基本的にh264/hevc annexbとmp4は同じですが、aacオーディオ用です)
35