「MEncoder/x264/トラブル事例/02_Bフレームを使うとQTP7proで加工不能」の編集履歴(バックアップ)一覧に戻る
MEncoder/x264/トラブル事例/02_Bフレームを使うとQTP7proで加工不能 - (2005/12/05 (月) 22:43:29) の編集履歴(バックアップ)
問題:Bフレームを使うとQTP7proで加工不能
再生はOK。
冒頭に白紙フレームが1枚入る。
冒頭に白紙フレームが1枚入る。
原因:MEncoderの "vfw mode"
冒頭の白紙は、"Delay Frame"。AVIにBフレームを入れる為の裏技(hack)。
Xvidの為に編み出されたものらしい。
DivX社の場合、これとは別種の"Packed B frame"とか、"DivX GOP"などと呼ばれる裏技を使う模様。
いずれも、本来Bフレームを入れる事が不可能なAVIでBを扱う為のもの。
AVI出力からスタートしたMEncoderを使う限り、B使用時の"Delay Frame"の挿入は不可避。
Xvidの為に編み出されたものらしい。
DivX社の場合、これとは別種の"Packed B frame"とか、"DivX GOP"などと呼ばれる裏技を使う模様。
いずれも、本来Bフレームを入れる事が不可能なAVIでBを扱う為のもの。
AVI出力からスタートしたMEncoderを使う限り、B使用時の"Delay Frame"の挿入は不可避。
対策
1)Bを使わなければ"Delay Frame"は入らず、「問題」は起きない。
2)Bを使った場合、完成後の.mp4から、冒頭の1フレームをカット。
例: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出力は未確認)
以上で、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オプションにはそれらしきものは見当たらない。
MEncoder Xvid オプションの(no)packed,divx5bvop,あたりが相当すると思われる。x264オプションにはそれらしきものは見当たらない。
"Delay Frame"
最初に空フレームを出力して、「1frame in 1frame outルール」を守る。
Xvid,x264ともに発生するので、MEncoder本体が "vfw mode"で動作していると思われる。modeといっても切る事ができるわけではないようだ。
Xvid,x264ともに発生するので、MEncoder本体が "vfw mode"で動作していると思われる。modeといっても切る事ができるわけではないようだ。
Winでは、Virtualdub(mod)でエンコードすると、自動的に"Delay Frame"は除去される模様。
なお、エンコード時、末尾の1フレームはメモリ内に留まったまま消失するらしい。
なお、エンコード時、末尾の1フレームはメモリ内に留まったまま消失するらしい。
動画のプロやハイアマチュアクラスでは問題だろうが、TVキャプチャレベルでは、音ズレに対処する場合を除けば、気にするほどの事では無いだろう。
参考図:MovieVideoChart による確認
その他
MEncoderは、PTSを考慮した作りになっていないとの情報もある。事実なら、B付きAVC.mp4出力が安定化する見込みは薄い。
ターミナルでx264のオプションをいろいろ試す場合、PやBの参照フレーム化など、Xvid等に比べて激しく複雑なオプションも使えるため、AVIからの抽出には疑問が残る。最初からrawvideo(.264)で吐くのが安全だろう。