#!/bin/bash
# Version 060917 charset="UTF-8",LF
#変数指定
##変数_ツールパス、出力拡張子指定
MENCODER=/usr/local/bin/mencoder
FFMPEG=/usr/local/bin/ffmpeg
MP4BOX=/usr/local/bin/mp4box
MUXMOVIE=/usr/local/bin/muxmovie
EXT=mp4
##変数_MEncoder Options --Video
EXTME=264
OPTSME_A="-nosound"
OPTSME_V="-ovc x264 -x264encopts threads=2:cabac:bitrate=1024:keyint=240:keyint_min=1:scenecut=55:bframes=2:b_adapt:weight_b:nob_pyramid:qp_min=10:qp_max=51:qp_step=4:qcomp=0.6:ratetol=4:deblock:deblockalpha=0:deblockbeta=0:cqm=jvt:nofast_pskip:direct_pred=3:psnr"
#:nodct_decimate
OPTSME_VP1=":pass=1:turbo=1"
OPTSME_VP2=":pass=2:me=3:subq=7:frameref=4:mixed_refs:8x8dct:i8x8:8x8mv:b8x8mv:i4x4:4x4mv:trellis=2:brdo:bime"
OPTSME_VF="-vf pullup,softskip,pp=l5,crop=720:480:0:0,scale=640:480:::4,hqdn3d=4:3:6,harddup"
OPTSME_OTHER2="-sws 9 -ofps 24000/1001 -of rawvideo"
##変数_ffmpeg Options --Audio
EXTFF=aac.mp4
OPTSFF="-y -vn -f mp4 -acodec aac -ar 48000 -ac 2 -ab 64 -map 1.1:0.0"
##変数_mp4box Options --mux
OPTSMP4BOX="-fps 23.976025"
##変数_muxmovie Options --Cutting Delay Frame
EXTMX=mov
OPTSMX="-startAt 00:00:00.05"
#for loop
for f in "$@"
do
foME="${f%.*}.${EXTME}"
foTEXT="${f%.*}.txt"
foTEXTLOG="${f%.*}.txt.log"
echo `date +%y/%m/%d" "%H:%M.%S` ${f##/*/} | tee ${foTEXT}
## MENCODER_PASS1
echo "===MENCODER_PASS1===" | tee -a ${foTEXT}
START_SEC=`date +%s`;echo `date +%m/%d" "%H:%M.%S` | tee -a ${foTEXT}
echo ${MENCODER} ${f} ${OPTSME_A} ${OPTSME_V}${OPTSME_VP1} -passlogfile ${foME}.log ${OPTSME_VF} ${OPTSME_OTHER2} -o /dev/null | tee -a ${foTEXT}
${MENCODER} ${f} ${OPTSME_A} ${OPTSME_V}${OPTSME_VP1} -passlogfile ${foME}.log ${OPTSME_VF} ${OPTSME_OTHER2} -o /dev/null >& ${foTEXTLOG}
### JIkan Keisan
echo " " | tee -a ${foTEXT};grep x264 ${foTEXTLOG} | tee -a ${foTEXT};echo " " | tee -a ${foTEXT};grep stream ${foTEXTLOG} | tee -a ${foTEXT};END_SEC=`date +%s`;TOTAL_SEC=`expr $END_SEC - $START_SEC`;HRS=`expr ${TOTAL_SEC} / 3600`;MIN=`expr ${TOTAL_SEC} % 3600 / 60`;SEC=`expr ${TOTAL_SEC} % 60`;TOTAL_TIME=${HRS}:${MIN}.${SEC};echo "SEC ; ${TOTAL_SEC}" | tee -a ${foTEXT};echo "TIME; ${TOTAL_TIME}" | tee -a ${foTEXT};echo " " | tee -a ${foTEXT}
## MENCODER_PASS2
echo "===MENCODER_PASS2===" | tee -a ${foTEXT}
START_SEC=`date +%s`;echo `date +%m/%d" "%H:%M.%S` | tee -a ${foTEXT}
echo ${MENCODER} ${f} ${OPTSME_A} ${OPTSME_V}${OPTSME_VP2} -passlogfile ${foME}.log ${OPTSME_VF} ${OPTSME_OTHER2} -o ${foME} | tee -a ${foTEXT}
${MENCODER} ${f} ${OPTSME_A} ${OPTSME_V}${OPTSME_VP2} -passlogfile ${foME}.log ${OPTSME_VF} ${OPTSME_OTHER2} -o ${foME} >& ${foTEXTLOG}
### JIkan Keisan
echo " " | tee -a ${foTEXT};grep x264 ${foTEXTLOG} | tee -a ${foTEXT};echo " " | tee -a ${foTEXT};grep stream ${foTEXTLOG} | tee -a ${foTEXT};END_SEC=`date +%s`;TOTAL_SEC=`expr $END_SEC - $START_SEC`;HRS=`expr ${TOTAL_SEC} / 3600`;MIN=`expr ${TOTAL_SEC} % 3600 / 60`;SEC=`expr ${TOTAL_SEC} % 60`;TOTAL_TIME=${HRS}:${MIN}.${SEC};echo "SEC ; ${TOTAL_SEC}" | tee -a ${foTEXT};echo "TIME; ${TOTAL_TIME}" | tee -a ${foTEXT};echo " " | tee -a ${foTEXT}
## FFMPEG_AUDIO
echo "===FFMPEG_AUDIO===" | tee -a ${foTEXT}
foFF="${f%.*}.${EXTFF}"
echo ${FFMPEG} -i ${foME} -i ${f} ${OPTSFF} ${foFF} | tee -a ${foTEXT}
${FFMPEG} -i ${foME} -i ${f} ${OPTSFF} ${foFF}
## MP4BOX_--mux
echo "===MP4BOX_--mux===" | tee -a ${foTEXT}
echo ${MP4BOX} ${OPTSMP4BOX} -add ${foME} -add ${foFF} -new ${f%.*}.${EXT} | tee -a ${foTEXT}
${MP4BOX} ${OPTSMP4BOX} -add ${foME} -add ${foFF} -new ${f%.*}.${EXT}
## MP4BOX_--info
echo "===MP4BOX_--info===" | tee -a ${foTEXT}
echo ${MP4BOX} -info ${f%.*}.${EXT} | tee -a ${foTEXT}
${MP4BOX} -info ${f%.*}.${EXT} | tee -a ${foTEXT}
## muxmomvie -- Cut Delay frame
#echo "===muxmomvie -- Cut Delay frame ===" | tee -a ${foTEXT}
#echo ${MUXMOVIE} ${OPTSMX} ${f%.*}.${EXT} -o ${f%.*}.${EXTMX} | tee -a ${foTEXT}
#${MUXMOVIE} ${OPTSMX} ${f%.*}.${EXT} -o ${f%.*}.${EXTMX} 2>> ${foTEXT}
## 中間生成物削除
rm ${foME}
rm ${foME}.log
rm ${foFF}
rm ${foTEXTLOG}
done
$ chmod a+x VGA243)ターミナルでVGA24、続いて素材ファイルをD&D。複数処理可。リターンで開始。例えば"VGA24"がデスクトップにある場合、
$ /Users/ユーザ名/Desktop/VGA24 ここにXXX.mpegをD&D リターン
FFmpeg プロジェクトをスポンサードしたGoogle Summer of Code プロジェクトに感謝したい。SoC 2006のおかげで、FFmpeg プロジェクトは学生たちの手を借りて、より多くのネイティブコデックを実装する事が出来た。
今回のリリースのハイライトはネイティブな VC-1/WMV3、On2 VP5、VP62 (一部のFlash video fileが使う)のデコード。これらは非intelプラットフォームでも動く。それからSSA/ASS/color 字幕だ。
さらにMPlayerはIntel Macでもネイティブに動作するようになった(configureオプションで --disable-loader --disable-mp3libを指定する事)。-endpos が遂にMPlayerで動くようになり、またWindows GUI にも多数の改善点がある。
Vorbisのデコードは大幅に高速化した。H.264も同様。H.264への最適化は今も進行中だが、現段階でも違いは大きい。
そして最後に特に、pre8以降に数多くのバグが発見され、修正された。
MPlayer 1.0rc1はもはや、再生ファイルと同じ場所にあるそのファイル固有の設定ファイルを読み込まない。潜在的なセキュリティ問題の為だ(この点を指摘した Rudolf Polzerに感謝したい); 以前通りの動作を望む場合は -use-filedir-confを使って欲しい。
既にpre8のバイナリ・コデックパッケージを使っている場合は、再ダウンロードの必要は無い。あたらしい 20061022 packageには新しいコデックは一切入っていない。pre8版に欠けているのは新しくネィティブで動くようになったコデックだけだ。
MPlayer 1.0rc1 のダウンロードは以下から。負荷分散のため、できるだけミラーを使って下さい。(ほんとにメインサーバー弱いです)
MPlayer 1.0rc1 は BitTorrentでも入手できます。
MD5SUM: 18c05d88e22c3b815a43ca8d7152ccdc
SHA1SUM: a450c0b0749c343a8496ba7810363c9d46dfa73c
2006/11/13時点、冒頭部のみ
BIG FAT WARNING:
この注意書きは私の至らなさをカバーすると共に、あなたが間違った情報を信じること が無いようにするためでもありま す。この文書は x264ガイドの "ワーキング・アルファ"です。整合性のチェックや校正は未完了ですし、リンクも死んでいたり、不完全だったりします。また、x264のスイッチ(*オプ ション)の中には正確さをチェックすべきものや(というのはそれらが技術的な内容を含み、私が動画符号化の全てを知る事はできないからです)、説明を補足 すべきものがあります。おそらくこのガイドの完成度は、満足なレベルの 80% ですが、中にはこれで充分という人もあるでしょう。この "ワーキング・アルファ" の目的は #AMV @ irc.zirc.org の常連からフィードバックを貰って、このガイドに従えばエンコードできるというレベルまで完成度を上げる為です(ですから "ワーキング・アルファ" なわけです)。 急いで書いて、校正を省いたために意味を為さない部分が残っています。そうした箇所は校正で直す予定です(校正に値するレベルになる前に、一旦全体を書き 上げる必要があったので)。
また、このガイドでは.264を出力してmuxは別途行う方法を採っています。私は まだMP4Boxのガイドを書いていないので、MP4Boxについて言及している箇所は無視し、出力拡張子を.mp4にしてMP4を直吐きする方法を採っ て下さい。
よろしく。Zero1
// 自分で dwStart をセットするが…
//muxer_avi.c, Line 290 @ 1.0rc1
if (s->type == MUXER_TYPE_AUDIO && muxer->audio_delay_fix > 0.0) {
s->h.dwStart = muxer->audio_delay_fix * s->h.dwRate/s->h.dwScale + 0.5;
...
}
// 再生するときは自分自身、厳守しない...
// cfg-common.h
// ignore header-specified delay (dwStart)
{"ignore-start", &ignore_start, CONF_TYPE_FLAG, 0, 0, 1, NULL},
{"noignore-start", &ignore_start, CONF_TYPE_FLAG, 0, 1, 0, NULL},
// audio_delay_fix は encoder_delay に対応するのだが、
// bフレームを使うと1にセットされる(x264でピラミッドだと2)
// ve_xvid.c
#ifdef XVID_API_UNSTABLE
fp->mux->decoder_delay = enc_param.max_bframes ? 1 : 0;
#endif
/*
つまり…xvidでは映像1フレーム、x264では2フレームに対応するdwStart(音声の遅れ)
がセットされるが、ほとんどの再生側ではdwStartは尊重されず、混乱の原因になる。
そもそも「bフレームを使うから音声を遅らせなければいけない」という考えが、
一般に正しくない。デコーダーがbフレームをどう処理するかの問題であり、
dwStartでハードコーディングするべきでない。さいわい、たまたまdwStartを皆が無視するので、
表面化していない。
XviDの場合は XVID_API_UNSTABLE がセットされていると、
1フレーム遅れる。
*/
mplayer -v で見たときのdwStart
この例では Start: 0 つまりゼロ
====== STREAM Header =====
Type: auds FCC: (0)
Flags: 0
Priority: 0 Language: 17
InitialFrames: 1
Start: 0 ...
===MENCODER_PASS1===
/usr/local/bin/mencoder /Users/ageha06/Movies/TEST/scenecuttest/KERO_OP_01_min30sc40.mpeg -nosound -ovc x264 -x264encopts threads=2:bitrate=1024:bframes=0:nob_adapt:noweight_b:nob_pyramid:keyint=300:keyint_min=30:scenecut=40:qp_min=10:qp_max=51:qp_step=4:qcomp=0.6:ratetol=4:deblock:deblock=0,0:cqm=flat:cabac:direct_pred=auto:nofast_pskip:nodct_decimate:nointerlaced:noglobal_header:psnr:ssim:pass=1:me=umh:subq=7:frameref=4:mixed_refs:no8x8dct:partitions=p8x8,b8x8,i4x4:trellis=2:brdo:bime -passlogfile /Users/ageha06/Movies/TEST/scenecuttest/KERO_OP_01_min30sc40.264.log -vf pp=l5,crop=720:480:0:0,scale=640:480:::4,hqdn3d=4:3:6,harddup -sws 9 -ofps 30000/1001 -of rawvideo -o /dev/null
===MENCODER_PASS2===
/usr/local/bin/mencoder /Users/ageha06/Movies/TEST/scenecuttest/KERO_OP_01_min30sc40.mpeg -nosound -ovc x264 -x264encopts threads=2:bitrate=1024:bframes=0:nob_adapt:noweight_b:nob_pyramid:keyint=300:keyint_min=30:scenecut=40:qp_min=10:qp_max=51:qp_step=4:qcomp=0.6:ratetol=4:deblock:deblock=0,0:cqm=flat:cabac:direct_pred=auto:nofast_pskip:nodct_decimate:nointerlaced:noglobal_header:psnr:ssim:pass=2:me=umh:subq=7:frameref=4:mixed_refs:no8x8dct:partitions=p8x8,b8x8,i4x4:trellis=2:brdo:bime -passlogfile /Users/ageha06/Movies/TEST/scenecuttest/KERO_OP_01_min30sc40.264.log -vf pp=l5,crop=720:480:0:0,scale=640:480:::4,hqdn3d=4:3:6,harddup -sws 9 -ofps 30000/1001 -of rawvideo -o /Users/ageha06/Movies/TEST/scenecuttest/KERO_OP_01_min30sc40.264
設定(太字が変更点) | I枚数 | 画質(最良/最悪) | |||||||
NO. | keyint | keyint_min | scenecut | sliceI | sliceP | I/P比 | AVGQP(P) | PSNR(*2) | SSIM |
01_min30sc40(標準的設定) | 300 | 30 | 40 | 18 | 3138 | 0.57% | 30.58 | 38.936 | 0.9698 |
scenecutのみ調整 | |||||||||
02_min30sc75 | 300 | 30 | 75 | 24 | 3132 | 0.77% | 30.61 | 38.908 | 0.9697 |
03_min30sc100 | 300 | 30 | 100 | 30 | 3126 | 0.96% | 30.67 | 38.892 | 0.9696 |
keyint_minのみ調整 | |||||||||
04_min15sc40 | 300 | 15 | 40 | 20 | 3136 | 0.64% | 30.60 | 38.923 | 0.9698 |
05_min0sc40 | 300 | 0 | 40 | 21 | 3135 | 0.67% | 30.60 | 38.927 | 0.9698 |
両方極端に | |||||||||
06_min0sc100 | 300 | 0 | 100 | 34 | 3122 | 1.09% | 30.68 | 38.900 | 0.9696 |
07_nokeysc100(IDR排除*1) | 6000 | 6000 | 100 | 13 | 3143 | 0.41% | 30.57 | 38.923 | 0.9698 |
08_min300sc100 | 300 | 300 | 100 | 19 | 3137 | 0.61% | 30.60 | 38.919 | 0.9697 |
$ mp4box -raw 1 ケロロ軍曹_061201.mp42)fpsを指定して映像のみ.mp4に。
$ mp4box -fps 23.976025 -add ケロロ軍曹1_track1.h264 -new ケロロ軍曹_061201_track1.h264.mp43)muxmovie -startAtで映像にスタートディレイを設定。-startAtは時刻指定なので近似値で良い。
$ muxmovie -startAt 00:00:00.09 -self-contained ケロロ軍曹_061201_track1.h264.mp4 -o out ケロロ軍曹_061201_track1.h264.mp4.mov4)QuickTime Player Proで音声貼付け、.mp4へ書き出し。映音とも「そのまま」
最上段のFrames in Trackを正しく表示できる。 QuickTime Player Proの表示(林檎+Jのデータレート等)も正常表示。 開始フレームのタイムスタンプが0.083のままな事に注意。 |
QuickTime Player Pro、Apple-H.264、30fpsで作成、 フレーム並べ替え(bframes=1相当)有り。 開始フレームのタイムスタンプが0.033(30fpsの1フレームぶん)な事に注意。 |
![]() |
![]() |
b_adaptの効果でB枚数は不規則。bframes=3にもかかわらずのっけからIPBP。 syncフラグがIDR。I/P/B/参照Bなどの区別は出ない。 rawvideoを経由しているせいか、droppableフラグも無し。 少なくともQuickTimeインフラ上ではトリックプレイや低速CPUに弱い筈だ。 |
bframes=1、nob_adapt相当なのでBは規則的に入る。 syncフラグがIDR。Bにはdroppableなるフラグもついている。 トリックプレイや低速CPUに強い筈だ。 このへんの用語は映像コデック側の理屈よりなにかと「同期」を意識したものが多い。 Quick"Time"はやっぱ時間軸のインフラなのだろう。 |
$ mp4box -raw 1 kinshubanya_061203.mp42)fpsを指定して映像のみ.mp4に。
$ mp4box -fps 29.970030 -add kinshubanya_061203_track1.h264 -new kinshubanya_061203_track1.h264.mp43)muxmovie -startAtで映像にスタートディレイを設定。-startAtは時刻指定なので近似値で良い。
$ muxmovie -startAt 00:00:00.14 -self-contained kinshubanya_061203_track1.h264.mp4 -o out kinshubanya_061203.h264.mp4.mov4)QuickTime Player Proで音声貼付け、.mp4へ書き出し。映音とも「そのまま」
人を不安にさせる表示だが、QuickTime Player Pro、VLC 0.8.6とも再生は平気。
QuickTime Player Proは白紙フレームを表示する事も、開始点で早回しを押すと末尾に飛ぶ事もなく、まぁ平気。
終点で白紙フレームを表示する事があるが、これは実データを2コマも飛ばしてるわけだし。
再生中にマウスで任意の点に飛ぶとしばらくの間カクカクになるなど全般にトリックプレイに弱い印象があるが、これは元のファイルをQuickTime Player Proで見る際も同様。
VLCは開いた直後に一瞬緑フレームを表示する事がある。
図1、2を見た後では、意外になんとかなるもんだという印象を持ったが、かなりやばめなファイルである事は確実。
Avidemuxにはより実験的なmcdeintが移植されていながら、yadifが移植されて無いので奇妙に思っていたが、こうゆうことですか。
手許のファイルを20個ほど MovieVideoChartで開いてみたが、yadif=0固有の現象のようだ。フィールドオーダーの分析でアタマ2枚喰ってしまうのだろうか。
30fpsで他に有用なインタレ解除となると、filmdintかpp系という事になるが、、、いっそインタレ保持かなぁ。