「MEncoder/x264/トラブル事例/02_Bフレームを使うとQTP7proで加工不能」の編集履歴(バックアップ)一覧はこちら
MEncoder/x264/トラブル事例/02_Bフレームを使うとQTP7proで加工不能 - (2005/12/05 (月) 22:33:02) の最新版との変更点
追加された行は緑色になります。
削除された行は赤色になります。
*問題: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)で吐くのが安全だろう。
*問題: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"ができる。
--&font(80%){なお、"-mp4" を使うと.mp4出力を試行するが、手許では未成功。}
-得られた.movを、QuickTime Player Proで「そのまま」.mp4書き出し。
以上で、QTP7proで再生・加工可能なx264(B使用)+aac.mp4になる。
(*ffmpegでの映像・音声コピーでの.mp4出力は未成功)
**3) 音ズレの対処
QTP7proで.movから映像のみ抽出し、別途抽出した音声を追加する。「ムービーに追加」か「選択範囲に調整して追加」かは、ムービーの長さにより異なる。短いものは前者、長いものは後者が適しているようだ。
*MovieVideoChartによる確認
[[Chart.jpg>http://www6.atwiki.jp/how_to_use_ffmpegx/?cmd=upload&act=open&pageid=69&file=050124-Chart.jpg]]
MovieVideoChartというツールで.mp4内部のフレーム構造を視覚化できる。このツールについては[[MyCometG3さんのこの記事を参照されたい。>http://blog.so-net.ne.jp/MyCometG3/2005-11-14-1]]
**その他
-MEncoderは、PTSを考慮した作りになっていないとの情報もある。事実なら、B付きAVC.mp4出力が安定化する見込みは薄い。
-ターミナルでx264のオプションをいろいろ試す場合、PやBの参照フレーム化など、Xvid等に比べて激しく複雑なオプションも使えるため、AVIからの抽出には疑問が残る。最初からrawvideo(.264)で吐くのが安全だろう。
-"Delay Frame"など、AVIにBフレームを入れる技の詳細は以下を参照。
--[[MPEG-4のB- frameを AVI/VFW に入れるハッキング>http://www.wikihouse.com/htumenc/index.php?MEMO%2FMPEG-4%A4%CEB-%20frame%A4%F2%20AVI%A1%BFVFW%20%A4%CB%C6%FE%A4%EC%A4%EB%A5%CF%A5%C3%A5%AD%A5%F3%A5%B0]](MPlayer and MEncoder on MacOSX)
表示オプション
横に並べて表示:
変化行の前後のみ表示: