2006年02月05日

Man/CODEC固有オプション/-lavfopts --06/02月

【概要】MEncoder は直にx264+aac.mp4を吐くか?
【リンク】FFmpeg libavformat muxers (-lavfopts)
 MEncoder で直接x264+aac.mp4が吐けるなら、もちろんそれが望ましい。というか、それが現時点で望み得る「理想」(最善より良い)。

 Corey Hickey氏の熱意に当てられたのか、大御所(だと思うのだけど)Michael Niedermayer さんがlavf出力のバグ潰しに本腰を入れ始めたようだ。
 1月末頃のMPlayer-Dev-Eng-Digestから、、、
Hi
As many probably have alraedy seen iam trying to fix lavf muxing currently
so now is the best time to report bugs with lavf muxing! iam out of known
bugs ATM (excluding b frames of course, and a few which affect ffmpeg too)
 なにか広範囲な改造が必要らしく、話題が広範囲なスレッドに分散して、、、ようするに解らないんだけど^^;。でもまぁ、AVIの中で正しくBを扱うに はどうすんねんという議論のようだ。
 自分の推測では、基本的にMEncoderはAVI吐き出し専用。他のコンテナに吐き出すには、内部で一旦吐き出したAVIヘッダを、他のヘッダ形式に 書き直している。昨年の夏〜秋 頃に試してみたところでは、そんな印象を受けた。
 で、MEncoderでrawvideo.264を吐き、ffmpegでaac.mp4を吐き、mp4boxで.mp4にmuxする、というスクリプト を泣きながら組んだ。
 MEncoder で直接x264+aac.mp4が吐けるなら、それが理想だ。

エンコード試験

いまのところ、-of lavf -lavfopts format=mp4 -o ${INFILE}.mp4は動かない。

1)B付き設定
 エンコード中に以下の警告が出て止まる。
** MUXER_LAVF *****************************************************************
If you wish to use libavformat muxing, you must ensure that your video stream
does not contain B frames (out of order decoding) and specify:
-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames
on the command line.
REMEMBER: MEncoder's libavformat muxing is presently broken and will generate
INCORRECT files in the presence of B frames. Moreover, due to bugs MPlayer
will play these INCORRECT files as if nothing were wrong!
*******************************************************************************
Cannot initialize muxer.
2)B抜き設定
 では、-x264encoptsをbframe=0に、 さらに-lavfopts i_certify_that_my_video_stream_does_not_use_b_framesを指定すると警 告は以下のように切り替わり、エンコード完了。
** MUXER_LAVF *****************************************************************
You have certified that your video stream does not contain B frames.
REMEMBER: MEncoder's libavformat muxing is presently broken and will generate
INCORRECT files in the presence of B frames. Moreover, due to bugs MPlayer
will play these INCORRECT files as if nothing were wrong!
*******************************************************************************
OK, exit
 いいんだね?じゃ行くよ。って感じで通常のエンコードが走り出す。以前はこんな警告は出さず、単におかしなMP4を吐くだけだった。

検証

1)mp4box -info
 音声がおかしいが、これは-faacoptsに慣れていない所為だろう。映像はなんとかできているようだ。
$ mp4box -info /Users/USERNAME/Movies/TEST/T_CMcar_7mVBR.mpeg.mp4 
* Movie Info *
Timescale 1000 - Duration 00:00:14.891
Fragmented File no - 2 track(s)
File Brand isom - version 512

File has no MPEG4 IOD/OD

Track # 1 Info - TrackID 1 - TimeScale 30000 - Duration 00:00:14.814
Media Info: Language "und" - Type "vide" - Sub Type "avc1" - 444 samples
MPEG-4 Config: Visual Stream - ObjectTypeIndication 0x21
AVC/H264 Video - Visual Size 640 x 480
Self-synchronized

Track # 2 Info - TrackID 2 - TimeScale 48000 - Duration 00:00:14.890
Media Info: Language "und" - Type "soun" - Sub Type "mp4a" - 698 samples
MPEG-4 Config: Audio Stream - ObjectTypeIndication 0x40
Bus error
 -ofps 30000/1001を使った。mp4boxでmuxした場合はそれぞれ、60029969。A-V SyncはMEncoder -lavfの方が地味に緻密になると思われる。なお、QTベースのエンコードはどちらもぶっちぎりの90000。映像が60フィールド/秒でも余裕の精度 だろう。
 反面、TimeScaleの精度向上がCPUパワーを喰うものなら、デコード負荷が低いのはMEncoder/mp4boxの方だ。

 2)再生
 QT7.0.4:当然受け付けない。
 MovieVideoChart:開けない。
 MPlayer OSX:正常再生(音声含む)。
 VLC 0.8.4a:正常再生(音声含む)。警告「mp4: missing avcC」を吐く。

余談

 MPlayer/MEncoderのソースコードは屋上屋を架した状態で、心臓部ほどぐちゃぐちゃらしい。2003頃に次世代プロジェクトとして発足し たMPLayer G2のMLは閑古鳥だ。

 古いものを捨てて新しいものに移行するのは苦痛が伴う。誰だってOASISを捨ててWordに移行なんかしたくない。とことん抵抗するのは積み重ねた自 分の戦力が下がるからだ。将来なんてあやふやなものの為に、なぜ今使えているものを捨てる必要がある?。
 古いものを駆逐するには槍と鉄砲なみの戦力差が居る。それを犬にでも解る形で見せつけなければ、自発的な移行は進まない。

 FFMPEGとMPlayer/MEncoderは、同じ頃に兄弟プロジェクトになったと理解している。
 鯖も同居しているので、MPlayer鯖が死ぬとffmpeg-cvsも死ぬ。FFMPEGはコデック(livbavcodec)とコンテナ (libavformat)、MEncoderはビデオフィルタ。元々別ソフトだからかぶ る機能が多いのだけど、概ねそんな役割分担で動いているようだ。ビデオフィルタっていうのは、デノイズ、スケーリング、そしてインタレ解除に逆テレシネな ど。カジュアル・エンコードで奇麗に/小さくエンコードしよ うと思ったら、コデックのオプションなどよりこちらを追い込む方が圧倒的に、キク。ffmpegのフィルタ機能は本当に簡易的なものか、またはそもそも、 無い。

 -of lavfが安定するなら、mkv以外のほぼ全てに手が届く。Snowだって oggだってNUTだって。MEncoderとmkvtoolnixをコントロールするGUIを作れば、、、ってそれがMeGUIか。GUIの簡素化だけ なら、exeをSnowとx264cliとMEncoderに分ける必要など無い筈だ。将来の統合を見込んで、単機能部品を積み上げてるんだな。

/*/

-of lavfテスト設定
INFILE=~/Movies/TEST/T_CMcar_7mVBR.mpeg

#===MENCODER_PASS1===
/usr/local/bin/mencoder ${INFILE} ¥
-oac faac -faacopts br=128 ¥
-ovc x264 -x264encopts threads=2:bitrate=1024:qp_min=10:qp_max=51:b_adapt:bframes=0:keyint=240:scenecut=45:cabac:deblock:direct_pred=1:qp_step=4:qcomp=0.6:psnr:pass=1:me=2:subq=2:frameref=1:no8x8dct:noi8x8:no8x8mv:nob8x8mv:noi4x4:no4x4mv ¥
-passlogfile ${INFILE}.264.log ¥
-vf pp=l5,crop=720:480:0:0,scale=640:480,hqdn3d=4:3:6,harddup ¥
-sws 9 -ofps 30000/1001 ¥
-of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames ¥
-o ${INFILE}.mp4

#===MENCODER_PASS2===
/usr/local/bin/mencoder ${INFILE} ¥
-oac faac -faacopts br=128 ¥
-ovc x264 -x264encopts threads=2:bitrate=1024:qp_min=10:qp_max=51:b_adapt:bframes=0:keyint=240:scenecut=45:cabac:deblock:direct_pred=1:qp_step=4:qcomp=0.6:psnr:pass=2:me=3:subq=6:frameref=4:i4x4:4x4mv:nofast_pskip:weight_b:trellis=1:ratetol=4:mixed_refs:brdo:bime:deblockalpha=0:deblockbeta=0 ¥
-passlogfile ${INFILE}.264.log ¥
-vf pp=l5,crop=720:480:0:0,scale=640:480,hqdn3d=4:3:6,harddup ¥
-sws 9 -ofps 30000/1001 ¥
-of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames ¥
-o ${INFILE}.mp4

#===MP4BOX_--info===
/usr/local/bin/mp4box -info ${INFILE}.mp4
、、、 趣味的には、-oac copyでMP2音声そのまま残したいよなぁ。
posted by ばる at 01:03| Comment(2) | TrackBack(0) | mencoder | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントありがとうございます。
ばる様は映像を扱うプロなのでしょうか? 知識と熱意が、ずば抜けていると思います。

時々こちらにおじゃまして勉強させてください。(勉強というより、生徒が黒板の文字をノートにうつすようなものですが、、、)
Posted by nowhereman at 2006年02月06日 23:23
こんばんわ。

や、ただのマカです。
いろいろど素人以下なので、こちらこそ勉強させて頂きますm(_ _)m
Posted by ばる at 2006年02月07日 01:06
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス: [必須入力]

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/12765795
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。