x264:
どちらの場合でも、アプリケーションはx264が備えるAPIを呼び出す。なお、Mac OSX(BSD系も?)では動的ライブラリの拡張子は.dylibなのだが、サポートされていない模様。
x264cli:
MEncoder:
ffmpeg:
ffmpegX / MeGUI:
avc1Decoder / Perian / ffdshow:
avc1Encoder:
この中で特に、ffmpeg(libavcodec / libavformat)的な共通インフラは、コンピュータでマルチメディア(様々な形式の動画・音声・字幕・インタラクション、などなどなど)をやるなら当然に必要なものだが、全体への影響を考えないといけないのでそのぶん先進的なコデックへの対応に時間がかかる。程度の差こそあれ、QuickTime / DirectShow / VfW の何れも同じ手間がかかる。
プロジェクトとしてのx264は ffmpeg とは独立して突っ走っているのが特徴で、ノイズリダクションなど、符号化ライブラリが手を出す必要の無い機能にも手を付けている。また、x264vfw のサポートは2006年10月に停止している。
余談ながら、avc1Decoder / avc1Encoder その他 libavcodec の QT 移植を一人でやってしまった MyCometG3 さんはワールドワイド一騎当千だと思います。
剰余のことで、ひらたく言えば割り算の余りです。よってmod32とは32で割った余りです。C系の言語では%は整数剰余を意味する演算子なので、文中の式とも一致します。との事なので「mod32(≒32の倍数)、厳密には高さ÷32の余りが0から18以下ならOK」と理解すると、
QuickTime7はH.264のsarを受け付けませんが、QTP/iTunesで再生できるアナモルフィック・エンコードは一応可能です。
アナモルフィック・エンコードとは、720x480 や 704x480 の素材をそのままのサンプルサイズでエンコードするものです。サンプルサイズとは輝度情報の数字。それが 720x480 個並んでいますよというほどの意味。実際の表示サイズは720x480でも 704x480 でもないのですが、世の中の MPEG-2 はほとんどこのサイズです。プレイヤは別途 4:3 や 16:9 などの DAR 情報を読み込んで、正しい縦横比に直して表示します。
H.264/AVC規格には、720x480 のような特定サイズ制限がありません。ぶっちゃけ DAR もないです。SAR(サンプル・アスペクト・レシオ)。輝度サンプルいっこいっこに縦横比を持たせるとゆう イッチャッタ 、あわわ、自由な仕様。サンプルサイズも縦横比も、規格上はかなりフレキシブルです。
ただし頭書の通り QuickTime は受け付けません。それでも一応、Mac でもアナモルフィックはできますよとゆーハナシ。手許の素材は MPEG-2 TVキャプチャ(CaptyTV)のみ、つまり 4:3 指定の付いた 720x480 なので細かい数値はケースバイケースだと思います。
例えば
-vf pullup,softskip,pp=l5,crop=704:480:8:0,hqdn3d=4:3:6,harddup
※MEncoderは自動で sar 値を書き込む。この素材は両サイドの黒帯をクロップアウトした。この場合のSARは
x264 [info]: using SAR=8/9と出た。この記事にある値のどれとも合わないが、最終的に見た感じでは問題無いようだ。
林檎+ i で情報表示すると下の方にこういう表示がある。
この「現在のサイズ」というものを QuickTime Player Pro で変更する。
ちなみにVLCとMPlayer (OSX) は4:3、きちんとした縦横比で表示する。
林檎+ j でプロパティを出し、ビデオトラックのタブ「ビジュアル設定」を下図のように変更。
※Bフレームを使っている場合は、一旦ビデオトラックを取り出して冒頭の白紙フレームを削除しておく。手許ではweight_b を使うので2フレーム。
このファイルはQTP(+ avc1Decorder)、iTunes、VLCともに受け付けた。
なお、QT系が 640x480で表示したのに対し、VLCは 704x528 で表示した。コンテナの「調整後のサイズ」ではなくビデオストリーム内の sar値を読んでいると思われる。規格上、どっちが正しい挙動なのかは不詳。
エンコード前の拡大は映像の汚れを生み、縮小はディテイルの損失を生むため、アナモルフィック・エンコードの方が素材に対して忠実、つまり高画質とされています。例えば:http://www.mplayerhq.hu/DOCS/HTML/en/menc-feat-quicktime-7.html#menc-feat-quicktime-7-constraints など。
『素材を極力弄るな』はエンコードのキホンですから、これが定石です。ただしこれは徹底的な画質追求をする際の固定条件であって、体感画質と一致するとは限りません。
1)現実に目にする画質はプレイヤの性能次第です。
720 (or702)x480は輝度情報の数字が720x480個並んでいますよという事で、正しい縦横比で表示するには縦か横を拡大 /縮小する必要があります。実用上、Mac OSXで SARを解釈できるプレイヤは VLC かMPlayer (OSX) くらいなのですが [*1]、これらオープンソース系は CoreVideo [*2] 対応がまだ厳しいです。
これはデコード終了後、画面に映像を出す段階で差がつくようです。右図→
上段は 横幅702でエンコードしたものを VLC と QuickTime PlayerPro で同サイズ表示したもの。下段は横幅640に縮小してからエンコードしたものです。スクショを jpg化していますが違いは見て取れると思います。
上段はヘルメット部分に画質差があります。この差は下段ではやや詰まっています。つまり、エンコード前に正しい縦横比に縮小 /拡大してしまった方がプレイヤのリアルタイムスケーリングに任せるよりキレイに見える、事もある、ということです。VLCの方は初期設定を弄ればなんとかなるかもしれません。ただし、この素材ではコマ単位で見比べなければそうそう目にとまるとは思いませんでした。
2)また当然ながら、ビットレートが同じなら縮小した方が数値画質は有利です。上下とも1024kbpsでやった結果は以下。
No. | disc. | SSIM | PSNR(Y) | AVG QP(P) | SAR |
---|---|---|---|---|---|
01 | 702x480 no scaling | 0.9519027 | 40.499 | 25.42 | 8/9 |
02 | 702x480 to 640x480 | 0.9537451 | 40.662 | 24.71 | 48/49 |
- | diff | 0.0018424 | 0.163 | -0.71 | - |
サンプル解像度が異なるのに同じビットレートで画質や PSNR や SSIM を比べても意味が無いのですが、要求条件にファイルサイズを加える場合は効いてきます。SAR がどうだろうが QT系は無視して1/1で表示します。VLC / MPlayer (OSX)もそんなに悪く無い縦横比で表示します。どのみち表示サイズは 704x480 ではない、と考えるなら、事前にスケーリングしてしまう方が潰しが効くファイルになります。なお、アニメに 1024kbps与えて SSIM 0.95台ってのは酷いです。以前は悪くても0.977は出ていたのですが…。
最後にファナティックな事を言えば、もとよりサクヒンは4:3や16:9 [*3]で見られる事を意図しています。つまり忠実であるべきは素材のデータか、作り手の意思か。720x480のようなサンプリング解像度は作り手の意思というわけではありません。4:3には過剰、16:9には不適合な10年以上前の技術的妥協点ですから、特にそれに縛られる必要は無いと考える事もできます。
[*1]:QuickTime の構造上、avc1Decorder, Perianともに対応困難な模様です。
[*2]:グラフィックカードの機能を呼び出すOSのAPI。
[*3]:さらにファナティックにいえば16:9もアナログハイビジョンの都合です。16:9の映画は存在しません。
おおきく振りかぶって_15_先取点_070720~.mpeg ===MENCODER_PASS1=== $ mencoder おおきく振りかぶって_15_先取点_070720~.mpeg -nosound -ovc x264 -x264encopts bitrate=1024:bframes=3:b_adapt:weight_b:b_pyramid:keyint=240:keyint_min=1:scenecut=65:qp_min=19:qp_max=51:qp_step=8:qcomp=0.6:ratetol=4:deblock:deblock=0,0:cqm=jvt:cabac:direct_pred=auto:nofast_pskip:nodct_decimate:nointerlaced:noglobal_header:psnr:ssim:pass=1:threads=2:8x8dct:turbo=1 -passlogfile おおきく振りかぶって_15_先取点_070720~.264.log -vf pullup,softskip,pp=l5,crop=704:480:8:0,hqdn3d=4:3:6,harddup -vfm ffmpeg -sws 9 -ofps 24000/1001 -of rawvideo -o /dev/null x264 [info]: using SAR=8/9 x264 [info]: using cpu capabilities: Altivec x264 [info]: slice I:17 Avg QP:25.53 size: 24999 PSNR Mean Y:41.28 U:48.87 V:49.79 Avg:42.70 Global:41.47 x264 [info]: slice P:747 Avg QP:27.46 size: 7770 PSNR Mean Y:38.60 U:46.93 V:48.02 Avg:40.08 Global:39.65 x264 [info]: slice B:666 Avg QP:28.94 size: 1155 PSNR Mean Y:38.37 U:47.12 V:48.22 Avg:39.87 Global:39.46 x264 [info]: mb I I16..4: 16.8% 45.9% 37.3% x264 [info]: mb P I16..4: 9.8% 8.0% 2.6% P16..4: 61.7% 7.6% 2.3% 0.0% 0.0% skip: 7.9% x264 [info]: mb B I16..4: 0.1% 0.2% 0.0% B16..8: 11.8% 0.0% 0.0% direct:13.5% skip:74.3% x264 [info]: final ratefactor: 23.81 x264 [info]: 8x8 transform intra:40.1% inter:33.7% x264 [info]: direct mvs spatial:94.3% temporal:5.7% x264 [info]: SSIM Mean Y:0.9496788 x264 [info]: PSNR Mean Y:38.524 U:47.046 V:48.138 Avg:40.017 Global:39.577 kb/s:938.68 Video stream: 938.848 kbit/s (117355 B/s) size: 6999453 bytes 59.643 secs 1789 frames SEC ; 109 TIME; 0:1.49 ===MENCODER_PASS2=== $ mencoder おおきく振りかぶって_15_先取点_070720~.mpeg -nosound -ovc x264 -x264encopts bitrate=1024:bframes=3:b_adapt:weight_b:b_pyramid:keyint=240:keyint_min=1:scenecut=65:qp_min=19:qp_max=51:qp_step=8:qcomp=0.6:ratetol=4:deblock:deblock=0,0:cqm=jvt:cabac:direct_pred=auto:nofast_pskip:nodct_decimate:nointerlaced:noglobal_header:psnr:ssim:pass=2:threads=16:me=umh:me_range=32:subq=7:frameref=4:mixed_refs:8x8dct:partitions=p8x8,b8x8,i8x8,i4x4:trellis=2:brdo:bime -passlogfile おおきく振りかぶって_15_先取点_070720~.264.log -vf pullup,softskip,pp=l5,crop=704:480:8:0,hqdn3d=4:3:6,harddup -vfm ffmpeg -sws 9 -ofps 24000/1001 -of rawvideo -o おおきく振りかぶって_15_先取点_070720~.264 x264 [info]: using SAR=8/9 x264 [info]: using cpu capabilities: Altivec x264 [info]: slice I:17 Avg QP:23.53 size: 27251 PSNR Mean Y:43.15 U:49.45 V:50.37 Avg:44.46 Global:43.85 x264 [info]: slice P:747 Avg QP:25.42 size: 8479 PSNR Mean Y:39.55 U:47.36 V:48.49 Avg:41.00 Global:40.78 x264 [info]: slice B:666 Avg QP:27.00 size: 1234 PSNR Mean Y:38.90 U:47.50 V:48.68 Avg:40.40 Global:40.15 x264 [info]: mb I I16..4: 3.5% 92.3% 4.2% x264 [info]: mb P I16..4: 0.1% 2.6% 0.3% P16..4: 66.9% 13.3% 6.4% 0.0% 0.0% skip:10.4% x264 [info]: mb B I16..4: 0.0% 0.0% 0.0% B16..8: 23.2% 0.4% 1.4% direct: 2.0% skip:73.0% x264 [info]: 8x8 transform intra:89.3% inter:77.3% x264 [info]: direct mvs spatial:86.3% temporal:13.7% x264 [info]: ref P 60.6% 19.7% 12.4% 7.2% x264 [info]: ref B 82.1% 10.7% 5.4% 1.7% x264 [info]: SSIM Mean Y:0.9519027 x264 [info]: PSNR Mean Y:39.293 U:47.450 V:48.602 Avg:40.764 Global:40.499 kb/s:1021.97 Video stream: 1022.145 kbit/s (127768 B/s) size: 7620464 bytes 59.643 secs 1789 frames SEC ; 362 TIME; 0:6.2
scale=640:480:::3 -sws 9
はタップ数3のlanczos、の、ハズ。
おおきく振りかぶって_15_先取点_070720~.mpeg ===MENCODER_PASS1=== $ mencoder おおきく振りかぶって_15_先取点_070720~.mpeg -nosound -ovc x264 -x264encopts bitrate=1024:bframes=3:b_adapt:weight_b:b_pyramid:keyint=240:keyint_min=1:scenecut=65:qp_min=19:qp_max=51:qp_step=8:qcomp=0.6:ratetol=4:deblock:deblock=0,0:cqm=jvt:cabac:direct_pred=auto:nofast_pskip:nodct_decimate:nointerlaced:noglobal_header:psnr:ssim:pass=1:threads=2:8x8dct:turbo=1 -passlogfile おおきく振りかぶって_15_先取点_070720~.264.log -vf pullup,softskip,pp=l5,crop=704:480:8:0,scale=640:480:::3,hqdn3d=4:3:6,harddup -vfm ffmpeg -sws 9 -ofps 24000/1001 -of rawvideo -o /dev/null x264 [info]: using SAR=48/49 x264 [info]: using cpu capabilities: Altivec x264 [info]: slice I:17 Avg QP:24.94 size: 24954 PSNR Mean Y:40.97 U:48.50 V:49.36 Avg:42.38 Global:41.29 x264 [info]: slice P:735 Avg QP:26.74 size: 7763 PSNR Mean Y:38.68 U:46.94 V:48.01 Avg:40.16 Global:39.72 x264 [info]: slice B:678 Avg QP:28.21 size: 1224 PSNR Mean Y:38.50 U:47.17 V:48.26 Avg:40.01 Global:39.60 x264 [info]: mb I I16..4: 20.4% 36.1% 43.5% x264 [info]: mb P I16..4: 9.6% 6.5% 2.8% P16..4: 63.3% 8.3% 2.8% 0.0% 0.0% skip: 6.7% x264 [info]: mb B I16..4: 0.2% 0.2% 0.1% B16..8: 12.6% 0.0% 0.0% direct:15.8% skip:71.2% x264 [info]: final ratefactor: 23.06 x264 [info]: 8x8 transform intra:34.6% inter:29.3% x264 [info]: direct mvs spatial:97.5% temporal:2.5% x264 [info]: SSIM Mean Y:0.9514350 x264 [info]: PSNR Mean Y:38.626 U:47.066 V:48.145 Avg:40.114 Global:39.683 kb/s:933.47 Video stream: 933.639 kbit/s (116704 B/s) size: 6960617 bytes 59.643 secs 1789 frames SEC ; 116 TIME; 0:1.56 ===MENCODER_PASS2=== $ mencoder おおきく振りかぶって_15_先取点_070720~.mpeg -nosound -ovc x264 -x264encopts bitrate=1024:bframes=3:b_adapt:weight_b:b_pyramid:keyint=240:keyint_min=1:scenecut=65:qp_min=19:qp_max=51:qp_step=8:qcomp=0.6:ratetol=4:deblock:deblock=0,0:cqm=jvt:cabac:direct_pred=auto:nofast_pskip:nodct_decimate:nointerlaced:noglobal_header:psnr:ssim:pass=2:threads=16:me=umh:me_range=32:subq=7:frameref=4:mixed_refs:8x8dct:partitions=p8x8,b8x8,i8x8,i4x4:trellis=2:brdo:bime -passlogfile おおきく振りかぶって_15_先取点_070720~.264.log -vf pullup,softskip,pp=l5,crop=704:480:8:0,scale=640:480:::3,hqdn3d=4:3:6,harddup -vfm ffmpeg -sws 9 -ofps 24000/1001 -of rawvideo -o おおきく振りかぶって_15_先取点_070720~.264 x264 [info]: using SAR=48/49 x264 [info]: using cpu capabilities: Altivec x264 [info]: slice I:17 Avg QP:23.12 size: 27106 PSNR Mean Y:42.39 U:49.03 V:49.88 Avg:43.73 Global:43.23 x264 [info]: slice P:735 Avg QP:24.71 size: 8582 PSNR Mean Y:39.69 U:47.40 V:48.48 Avg:41.13 Global:40.92 x264 [info]: slice B:678 Avg QP:26.24 size: 1315 PSNR Mean Y:39.10 U:47.56 V:48.69 Avg:40.59 Global:40.35 x264 [info]: mb I I16..4: 4.1% 85.0% 11.0% x264 [info]: mb P I16..4: 0.1% 2.4% 0.4% P16..4: 67.2% 13.0% 7.3% 0.0% 0.0% skip: 9.6% x264 [info]: mb B I16..4: 0.0% 0.0% 0.0% B16..8: 23.3% 0.5% 1.5% direct: 2.9% skip:71.8% x264 [info]: 8x8 transform intra:83.9% inter:67.5% x264 [info]: direct mvs spatial:90.0% temporal:10.0% x264 [info]: ref P 61.1% 19.6% 12.4% 6.8% x264 [info]: ref B 84.1% 9.6% 5.0% 1.3% x264 [info]: SSIM Mean Y:0.9537451 x264 [info]: PSNR Mean Y:39.440 U:47.493 V:48.598 Avg:40.903 Global:40.662 kb/s:1027.43 Video stream: 1027.606 kbit/s (128450 B/s) size: 7661175 bytes 59.643 secs 1789 frames SEC ; 379 TIME; 0:6.19
※本記事の実際の投稿日は2007/8/21日です。
知った場所:So-net blog:MyCometG3:HandBrake 0.9.0。 http://blog.so-net.ne.jp/MyCometG3/2007-08-20
0.8.5bxにあった、致命的なmpeg4ipの不具合が解消されています。
とあったので、mp4creatorを抽出できるかも!と思ったけど、一体型だった。せっかくなので読めるとこ読む。
ただコレ、CaptyTVなどのMPEG-2 PSを受け付けないので手許では使ってないです。
NEWS file for HandBrake <http://handbrake.m0k.org/> Changes between 0.8.5b1 and 0.9.0: Core HandBrake Changes + Added: Matroska (MKV) container output + Added: Limited MPEG-2 transport stream (.VOB and .TS) input support + Added: Option to write MP4 files larger than 4GB + Added: Video filters (pullup, yadif, mcdeint, hqdn3d, pp7) + Added: DTS audio input + Changed: Switched to Lanczos scaling from libswscale + Changed: Precise chapter marker location + Changed: Newer libraries + Changed: Much faster (threaded) iPod encoding + Changed: “Same as source“ works differently (better?) now + Fixed: Audio drops should be thoroughly banished now + Fixed: MP2 audio support Assorted other changes CLI Changes: + Added: Chapter naming + Added: Many new command line options for subtitles and filters. + Added: Turbo for 2-pass x264 encodes Assorted other changes Mac Changes: + Added: Chapter naming + Added: Growl support + Added: Advanced x264 settings tab + Added: Logging window + Added: Turbo for 2-pass x264 encodes + Added: Many new presets + Added: Unified toolbar + Changed: Default settings + Changed: Further integration of the queue and active queuing + Changed: Browse DVDs like any other volumes + Fixed: No more floating window syndrome (Mac) + Fixed: Presets retain “magic sauce“ when you change settings Assorted other changes手許の設定とまったく同じものがつくれそうな印象を受けた。
Welcome to Darwin! $ HandBrakeCLI --help Syntax: HandBrakeCLI [options] -i <device> -o <file> ### General Handbrake Options------------------------------------------------ -h, --help ヘルプを表示 -u, --update アップデートをチェックして exit -v, --verbose 詳細な情報を表示 -C, --cpu CPU数を指定 (default: 自動検出) ### Source Options----------------------------------------------------------- -i, --input <string> input deviceを指定 -t, --title <number> エンコードするタイトルの選択 (0 to scan only, default: 1) -L, --longest 一番長いタイトルを選択 -c, --chapters <string> チャプタを選択 (例:“1-3“ でチャプタ1から3。 “3“ でチャプタ3のみ。default: 全チャプタ) ### Destination Options------------------------------------------------------ -o, --output <string> 出力ファイル名の指定 -f, --format <string> 出力フォーマットの指定 (avi/mp4/ogm/mkv, default: ファイル名から自動選択) -4, --large-file 64-bit mp4 ファイルを使う。4GBより大きくできる。 注意: iPod, @TV, PS3 非互換。 ### Picture Settings--------------------------------------------------------- -w, --width <number> ピクチャの幅を指定 -l, --height <number> ピクチャの高さを指定 --crop <T:B:L:R> クロップ値の指定 (default: 自動クロップ) -Y, --maxHeight <#> 高さの最大値を指定 ← ナニコレ? -X, --maxWidth <#> 幅の最大値を指定 ← ナニコレ? -s, --subtitle <number> 字幕の選択 (default: none) -U, --subtitle-scan Scan for subtitles on the first pass, and choose the one that's only used 20 percent of the time or less. This should locate subtitles for short foreign language segments. Only works with 2-pass. 1stパスで字幕をスキャンし、時間の20%以下しか使わなかったものを選択する。 これで短い外国語セグメント用の字幕をlocateする事になる。 2-passでしか使えない。 -N, --native-language Select subtitles with this language if it does not <string> match the Audio language. Provide the language's iso639-2 code (fre, eng, spa, dut, et cetera) 字幕の言語選択をiso639-2 code (fre, eng, spa, dut, など)で指定。 Audio languageに基づく選択がうまくいかない時に使う。 -m, --markers チャプタ・マーカーの追加 (mp4 出力時のみ) ### Video Options------------------------------------------------------------ -e, --encoder <string> 映像符号化ライブラリの選択 (ffmpeg,xvid, x264,x264b13,x264b30 default: ffmpeg) ← ナニx264b13とかって -q, --quality <float> 画質を指定 (0.0..1.0) ← たぶん --qp相当 -Q, --crf CQPの代わりにCRFを使う ← Constant Rate Factor、 --crf相当 -S, --size <MB> ターゲットサイズの指定 -b, --vb <kb/s> 映像ビットレートの指定 (default: 1000) -r, --rate 映像フレームレートの指定 (5/10/12/15/23.976/24/25/29.97) -2, --two-pass two-pass モードを使う -d, --deinterlace デインターレース。フィルタは yadif または mcdeint ← 両者とも60fps化が可能。 <YM:FD:MM:QP> (default 0:-1:-1:1) ↑ たぶんそのモード選択。あとmcdeintは動き補償を行うので、たぶんソレ絡み。 -7, --deblock pp7 フィルタによるデブロック <QP:M> (default 0:2) -8, --denoise hqdn3d フィルタによるデノイズ <SL:SC:TL:TC> (default 4:3:6:4.5) ← 空間軸輝度、同彩度、時間軸輝度、同彩度 -9, --detelecine pullup フィルタによる逆テレシネ。 <L:R:T:B:SB:MP> (default 1:1:4:4:0:0) -g, --grayscale グレイスケール。 -p, --pixelratio ピクセルアスペクトレシオを映像ストリームに埋め込む。 ↑たぶん --sar。QTは1/1しか受け付けないはずだが、VLCやMPC向けだろう。 コンテナのほうに書き込むのならQTでもOK。 ### Audio Options----------------------------------------------------------- -E, --aencoder <string> 音声エンコーダの選択 (faac/lame/vorbis/ac3, ac3 はパススルーになる。 default: 推測*たぶん拡張子とかから*) -B, --ab <kb/s> 音声ビットレート (default: 128) -a, --audio <string> 音声チャンネルの選択 (“none“ で no audio, default: first one) -6, --mixdown <string> サラウンド音声のダウンミックス形式 (mono/stereo/dpl1/dpl2/6ch, default: dpl2) -R, --arate 音声サンプルレート (22.05/24/32/44.1/48 kHz) ### Advanced H264 Options---------------------------------------------------- -x, --x264opts <string> mencoder書式でx264の細かいオプションを指定: option1=value1:option2=value2 -T, --turbo 2-pass 時の1stを高速化 (x264 専用。PSNRは概ね 0.05dB低下し、1stは2~4倍早くなる) ↑厳密にはmencoder の turbo と違うかもしれないが、考え方は似たようなもんだと思う。
Bフレーム使用時の、冒頭の白紙フレーム(Edit box問題)が解決してるか否かは不明。DVDイメージ作れたら試す。