「MEncoder/x264/トラブル事例/02_Bフレームを使うとQTP7proで加工不能」の編集履歴(バックアップ)一覧に戻る
MEncoder/x264/トラブル事例/02_Bフレームを使うとQTP7proで加工不能 - (2005/12/05 (月) 22:45:37) のソース
*問題:Bフレームを使うとQTP7proで加工不能 再生はOK。 冒頭に白紙フレームが1枚入る。 *原因:MEncoderの "vfw mode" 冒頭の白紙は、"Delay Frame"。AVIにBフレームを入れる為の裏技(hack)。 Xvidの為に編み出されたものらしい。 DivX社の場合、これとは別種の"Packed B frame"とか、"DivX GOP"などと呼ばれる裏技を使う模様。 いずれも、本来Bフレームを入れる事が不可能なAVIでBを扱う為のもの。 AVI出力からスタートしたMEncoderを使う限り、B使用時の"Delay Frame"の挿入は不可避。 *対策 **1)Bを使わなければ"Delay Frame"は入らず、「問題」は起きない。 **2)Bを使った場合、完成後の.mp4から、冒頭の1フレームをカット。 例:[[QTCoffee>http://www.wikihouse.com/htumenc/index.php?QTCoffee]]で.mov化、QuickTime Player Proで「そのまま」.mp4書き出し $ muxmovie -startAt 00:00:00.06 -self-contained "ffmpegX製B付きx264+aac.mp4" -o "フルパス/出力ファイル名.mov" -カットするフレーム数は指定した秒数に応じて調節される。23.976fpsの場合、1フレームの持続時間は約0.0417sec。 -"-self-contained"を省くと参照形式movになり、速い。 -"-o フルパス/出力ファイル名.mov" を省くとデスクトップに"out.mov"ができる。 -音声もmuxした後でカットする方が違和感が少ない。 -なお、"-mp4" を使うと.mp4出力を試行するが、手許では未成功。従って、、、 続けてQuickTime Player Proで「そのまま」.mp4書き出し。 以上で、QTP7proで再生・加工可能なx264(B使用)+aac.mp4になる。 (ffmpegでの映像・音声コピーで.mp4出力は未確認) *補足:AVIにBフレームを入れる為の裏技 **vfw Video for Windows。Winの古い動画API。1フレーム処理したら、1フレーム(バッファから?)出力しなければならないというルール(1frame in 1frame out)がある。 マイクロソフトは新しいDirectShow APIも提供しており、移行を推奨しているがvfwを使うコデックもまだ多い模様。 **AVI vfw の標準コンテナ。上記制限からBフレームを扱えない。 **Bフレーム B付き動画ストリームでは、ファイル中のフレームの保存順は実際の表示順番とは異なる。 >保存順:IPB >表示順:IBP デコーダは以下の処理をする。 -1. Iを読み込んでデコード。1stフレームを生成、出力。Iはそのまま保持。 -2. Pを読み込んで、保持。 -3. Bを読み込み、I,P,Bを元に2ndフレームを生成、出力。 -4. I,Pを元に3rdフレームを生成、出力。 これは、vfwの「1frame in 1frame outルール」を守っていては実現できない。従って以下のような裏技(ハック)が作られた。 ***"Packed B frame" I「PB」のようにPとBを1フレームのように見せかける。BはPと一緒にデコーダ(のバッファ?)に進入するので、見かけ上、「1frame in 1frame outルール」は守られる。 MEncoder Xvid オプションの(no)packed,divx5bvop,あたりが相当すると思われる。x264オプションにはそれらしきものは見当たらない。 ***"Delay Frame" 最初に空フレームを出力して、「1frame in 1frame outルール」を守る。 Xvid,x264ともに発生するので、コデックを管理するMEncoder本体が "vfw mode"で動作していると思われる。modeといっても切る事ができるわけではないようだ。 Winでは、Virtualdub(mod)でエンコードすると、自動的に"Delay Frame"は除去される模様。 なお、エンコード時、末尾の1フレームはメモリ内に留まったまま消失するらしい。 動画のプロやハイアマチュアクラスでは問題だろうが、TVキャプチャレベルでは、音ズレに対処する場合を除けば、気にするほどの事では無いだろう。 **参考図:[[MovieVideoChart >http://blog.so-net.ne.jp/MyCometG3/2005-11-14-1]]による確認 [[Chart.jpg>http://www6.atwiki.jp/how_to_use_ffmpegx/?cmd=upload&act=open&pageid=69&file=050124-Chart.jpg]] **その他 MEncoderは、PTSを考慮した作りになっていないとの情報もある。事実なら、B付きAVC.mp4出力が安定化する見込みは薄い。 ターミナルでx264のオプションをいろいろ試す場合、PやBの参照フレーム化など、Xvid等に比べて激しく複雑なオプションも使えるため、AVIからの抽出には疑問が残る。最初からrawvideo(.264)で吐くのが安全だろう。