2005年11月13日

MAJOR#21_これが野球!(051029)

【概要】MEncoder,ffmpeg,mp4box
【タグ】[x264][.mp4][MEncoder][ffmpeg][mp4box][A/V Sync]
シェルスクリプトの時刻算定式が間違ってる事に今、気付いた。
2ndパスの開始時刻を取得してねぇ。いままでの2ndの所要時間・fps値、全部間違ってるw。
(1stの経過時間込みで計算してやんのorz)


映像 音声 特記事項
mp4box 24:59.812 24:59.605 0.207 -
QT7.0.3 24:59.81 24:59.60 0.21 ・再生可能。
・映像のデータ容量/データレートが0。
・加工不能
・冒頭に白紙フレーム
・Bを使うとdelay-frameが入る?
まず最初に、自分の視聴覚では問題を感じなかった事をお断りしておきます。
MP4の映/音同期はAVIとは全く異なるため、別に全長が異なっても気にする事はない可能性も考えるべきです
つまり、ストリームの全長が異なっていても、mp4ヘッダが適正に生成されていれば大丈夫なのではないか。(未解明)。
ここでは、
  1. MEncoderでx264+copy音声.avi作成
  2. mp4boxでraw x264抽出
  3. ffmpegでaac.mp4作成
  4. mp4boxで映像fpsベースでx264+aac.mp4にmux
と4段階の手順を踏んでいます。

恐らく冒頭の白フレームは、MPEG-4 ASP時代に編み出されたvfw/aviにBを突っ込むハック、delay-frameと思われます。[参考1]
linuxにvfwはありませんが、幅広く普及したためにMEncoderでもこれをサポートしている可能性を疑っています。[参考2]
MEncoderは長い間、linuxでaviを作成する事に主眼を置いて来たソフトのようですから。
ここでは一旦AVIで吐いていますし、-of lavf -o XXX.mp4でも一旦AVIヘッダを書いて、mp4ヘッダに「翻訳」しているように見えます。
*virtualdub(mod)はエンコード時にこのdelay-frameを除去する動作が仕込まれている模様。
*QT側がこれに対応する事は、あるわけ無いですね。動機が無い。

自分はWin機を持ちませんが、MEncoderやmp4boxのGUIがあるようなので、それに近い手順 を推測で組んで見ました(主流はAviSynth+x264cliのようですが)。ここで使ったMEncoder、x264とも手許でビルドしたほぼ最新 なので、MeGUI/YAMBとの違いは以下だけのハズです。
  • Mencoderの設定。
  • mp4boxのバージョン。→ Win界で、mp4boxで安全にAVC -in- AVI 抽出できるようになったのは4〜6月頃の模様。
  • 音声のエンコード方式。→ ffmpegで.mp4化。faacはraw audioしか吐かない模様。

疑問点

音ズレ防止の為に、ここでは一旦AVIで吐いています。しかし不安要素があります。

YAMBガイド内、MeGUIに関する記述
出力形式はraw file。ここではそれがベスト。

妖精現実2005/10/28の記事
AVCもx264の場合、無理をすれば(というか標準の機能で)AVIにも入れられるが、
多少制限あるので、こちらは全機能を発揮させるためにMP4に入れる方が望ましい。
mkvmergeは、昔はAVIに入れたAVCを受け付けてくれたが、今は原則としてMP4に入れたAVCでないと入力できなくなった(裏技はあるが)。
AVC-in-AVIからAVC-in-MP4に変換する道もあるが、あまり簡単ではない。
そんな面倒をするくらいなら初めからMP4で書き出すのが早道。
AviUtil実験室、H.264/AVC
x264のVFWを使ったAVI互換モードは動作が怪しいような。(mkvに入れたらシークが重すぎたり不安定だっ たり…)
H.264/AVCの標準コンテナはMP4なので、この形式にあわせてここではCLIクライアントを使用します。
CLI(Command Line Interface)クライアントでMP4への変換(エンコード)が出来ます。

※mkvmerge1.5.5以降はVFWのAVCはオプションをつけないとmux出来ないようにされたようです。
まず、
  • これらは初心者向けの安全を意識して書かれた文章(vfwやDirectshowの管理はややこしいようですから)なのか?
  • それとも、AVI自体に突っ込んだAVCがアレでナニなのか?
の判断を下す必要があります。
次に、
  1. MEncoderなどが、vfw互換モードを使っているかどうか?
  2. vfw互換モードを切るコマンドを探す。
事になるでしょう。なお、MEncoderでraw .264を吐いても冒頭の白フレームは出ます。

詳細

スクリプトで間違ってたとこは手で修正済。
========================================
Settings of MAJOR-1029.mpeg.mp4
========================================
sFN=aMA
iFN=/Volumes/Konrad/1031/MAJOR-1029.mpeg
vBITRATE=1024
cROP=720:480:0:0
sCALE=640:480
mEOFPS=23.976
aBITRATE=64
aSRATE=48000
mP4BOXfPS=23.976
===ME Settings Pass1===
mencoder ¥
${iFN} ¥
-ni -oac copy ¥
-ovc x264 -x264encopts ¥
threads=2:me=3:bitrate=${vBITRATE}:qp_min=16:qp_max=51:i4x4:frameref=5:subq=6:¥
keyint=230:cabac:deblock:nob_adapt:bframes=1:turbo=1:pass=1 ¥
-passlogfile ${iFN}.mp4.log ¥
-vf pullup,softskip,crop=${cROP},¥
scale=${sCALE},hqdn3d=4:3:6,pp=l5,harddup ¥
-sws 9 -ofps ${mEOFPS} ¥
-of avi -o ${iFN}.avi ¥
========================================
PASS_1 of MAJOR-1029.mpeg
========================================
START;13th,09:07:26
END__;13th,10:20:06
TOTAL_sec;4360
TOTAL_TIME= 1'12"40
TOTAL_fps;10.31
Video stream: 1049.256 kbit/s  (131157 B/s)  size: 196708245 bytes  1499.792 secs  44949 frames
Audio stream:  384.000 kbit/s  (48000 B/s)  size: 71983872 bytes  1499.664 secs
========================================
PASS_2 of MAJOR-1029.mpeg
========================================
START;13th,09:07:26
END__;13th,12:03:15
TOTAL_sec;6189
TOTAL_TIME= 1'43"09
TOTAL_fps;7.26
Video stream: 1025.199 kbit/s  (128149 B/s)  size: 192198029 bytes  1499.792 secs  44949 frames
Audio stream:  384.000 kbit/s  (48000 B/s)  size: 71983872 bytes  1499.664 secs
========================================
mp4box -info of MAJOR-1029.mpeg.mp4
========================================
* Movie Info *
    Timescale 600 - Duration 00:24:59.811
    Fragmented File no - 2 track(s)
    File Brand isom - version 1

File has root IOD
Scene PL 0xff - Graphics PL 0xff - OD PL 0xff
Visual PL: AVC/H264 Profile (0x15)
Audio PL: AAC Profile @ Level 2 (0x29)
No streams included in root OD

Track # 1 Info - TrackID 1 - TimeScale 23975 - Duration 00:24:59.812
Media Info: Language "und" - Type "vide" - Sub Type "avc1" - 35958 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:24:59.605
Media Info: Language "und" - Type "soun" - Sub Type "mp4a" - 70294 samples
MPEG-4 Config: Audio Stream - ObjectTypeIndication 0x40
MPEG-4 Audio AAC LC - 2 Channel(s) - SampleRate 48000
Synchronized on stream 1

参考:設定

  1. MEncoder:dev-CVS-051108-20:30-4.0.0 → 参考
  2. ffmpeg2:ffmpegX0.0.9t-r4内蔵版
  3. mp4box:ffmpegX0.0.9t-r4内蔵版

変数

#1. Set Hensu ###
sFN=aMA
iFN=/Volumes/Konrad/1031/MAJOR-1029.mpeg
oFN=${iFN}.mp4
tEMPkIROKU=${iFN}_tEMPRESULT.txt
kIROKU=${oFN}_RESULT.txt
vBITRATE=1024
cROP=720:480:0:0
sCALE=640:480
mEOFPS=23.976
aBITRATE=64
aSRATE=48000
mP4BOXfPS=23.976

映像--1st pass

#4. mencoder PASS1 ###
mencoder \
${iFN} \
-ni -oac copy \
-ovc x264 -x264encopts \
threads=2:me=3:bitrate=${vBITRATE}:qp_min=16:qp_max=51:i4x4:frameref=5:subq=6:\
keyint=230:cabac:deblock:nob_adapt:bframes=1:turbo=1:pass=1 \
-passlogfile ${iFN}.mp4.log \
-vf pullup,softskip,crop=${cROP},\
scale=${sCALE},hqdn3d=4:3:6,pp=l5,harddup \
-sws 9 -ofps ${mEOFPS} \
-of avi -o ${iFN}.avi

映像--2nd pass

#5. mencoder PASS2 ###
mencoder \
${iFN} \
-ni -oac copy \
-ovc x264 -x264encopts \
threads=2:me=3:bitrate=${vBITRATE}:qp_min=16:qp_max=51:i4x4:frameref=5:subq=6:\
keyint=230:cabac:deblock:nob_adapt:bframes=1:pass=2 \
-passlogfile ${iFN}.mp4.log \
-vf pullup,softskip,crop=${cROP},\
scale=${sCALE},hqdn3d=4:3:6,pp=l5,harddup \
-sws 9 -ofps ${mEOFPS} \
-of avi -o ${iFN}.avi

映像--.h264抽出

#6. mp4box -- extract .h264
'/Library/Application Support/ffmpegX/mp4box' \
-aviraw video ${iFN}.avi \

音声

#7. ffmpeg2 --Audio
'/Library/Application Support/ffmpegX/ffmpeg2' \
-i ${iFN} -y -vn -f mp4 -acodec aac -ab ${aBITRATE} -ar ${aSRATE} -ac 2
-map 0.1:0.0 \
${iFN}.aac.mp4

mux

#8. mp4box --mux
'/Library/Application Support/ffmpegX/mp4box' \
-fps ${mP4BOXfPS} \
-add ${iFN}_video.h264 \
-add ${iFN}.aac.mp4 \
-new ${oFN}

結果情報

'/Library/Application Support/ffmpegX/mp4box' \
-info ${oFN}
posted by ばる at 22:10| Comment(0) | TrackBack(0) | mencoder-x264 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

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

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

コメント: [必須入力]

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


※画像の中の文字を半角で入力してください。

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

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