MPEG4 H.264/AVCでエンコード

H.264/AVC解説 - Wikipedia
AVC(H.264)とは? - MPEGラボ

mkvのコーデックID

VFWコーデックを使用してAVIに入れたもの → V_MS/VFW/FOURCC/H264
CLIクライアントを使用してMP4に入れたもの → V_MPEG4/ISO/AVC

VFWではBフレームが正しく扱えない為、Bフレームを使うとフレームがずれたりすることがあるらしい。
何とかするにはXvidのPacked Bitstereamのような仕組みが必要とのこと。
参考情報 → 1 2 3

x264のVFWを使ったAVI互換モードは正式サポートされません。
今後はAVC in AVIは無くなっていくようです。

Status of AVC (aka h.264) in Matroska

Reading AVC / h.264 from an AVI (e.g. created with x264) will only use the "AVI compatibility mode".
Playback of files muxed that way may or may not work. I will not accept bug reports for that.
I do not know whether or not I will implement proper support for this.

AVIから読み込んだh.264/AVC(x264で作ったものなど)はAVI互換モードになる。
再生は動くかもしれないし動かないかもしれない。これについてのバグレポートは受け付けない。
これについてのサポートの実装を考慮することはしない。

x264

x264はオープンソースで開発されているH.264のコーデックです。
最新版はここから → x264 win32 daily builds

x264 CLIを落としてください。更新が早いです。

コマンドライン(CLI)

入力ファイルはHuffyuv(無劣化のコーデック)等でAVI2.0で出力しておきます。
AviSynthだけで処理してもかまいませんが。

  • Single Pass-Quantizer/Quality(品質ベース)の場合。
    作成されるファイルサイズにこだわらず、画像品質を一定に保つ場合に使用する。
    • [--qp] Constant Quantizer 固定量子化
    • [--crf] Constant Quality 固定品質(QPがCRFを中心にmin.QP 〜 max.QPまで変動する)
x264.exe -q 20 -b 2 -o outfile.mp4 infile.avs
# infile.avs
OpenDMLSource("D:\VideoFiles\infile.avi")
ConvertToYV12()
return last

AVS(AviSynth)でYV12形式で受け渡すようにします。(-b --direct --threads などのオプションはお好みで)
Q値は20±5程度が実用範囲とのこと。数値が大きいほど高圧縮。

  • 2pass Bitrate(ビットレート指定)の場合。
    例では2000Kbps。3pass以上はp1とp2の間にp3を指定して増やす。
    ビットレート指定エンコードはファイルサイズを決めうちしたい場合に使用する。
    ビットレート配分を決める為に通常は2pass以上のエンコードが必要。
x264.exe -p 1 -B 2000 -b 2 --stats x264.log -o outfile.mp4 infile.avs
x264.exe -p 2 -B 2000 -b 2 --stats x264.log -o outfile.mp4 infile.avs
# infile.avs
OpenDMLSource("D:\VideoFiles\infile.avi")
AssumeFPS(29.97)
ConvertToYV12()
return last

入力ファイルがVFRの場合は平均フレームレートがわからないのでAssumeFPS( )で明示的に指定する。
(AviSynthでNullフレームは扱えません)

  • 平均フレームレート[fps]=総フレーム数/再生時間[秒]
  • ファイルサイズ[MB]=(ビットレート[Kbps]/8)*再生時間[秒]/1024

再生

ffdshow(コーデック)を入れると出来ます。やっぱり更新が早いです。新しいものを使ってください。
ffdshow のVideo Decoder設定で出力(Output)の項目でオーバーレイミキサーを使用するに チェックを入れてください。
入れないとアスペクト比が反映されません。

MatroskaSplitterはHaali版の新しいもの(2005.01.13以降)が必要です。
公式MatroskaパックはHaali版なので問題ありません。
スプリッタだけ変えたければHaaliのページからダウンロードできます。
(ちなみにMP4コンテナの再生もHaaliMediaSplitterで対応できます。)

再生環境はCPUが最低P4-2.8GHz相当以上は必要じゃないかと思います。

エンコード(mkv)

作成例です。

AviSynthとx264 CLI、コマンド実行プラグインを使用します。

  • 準備
    • itvfrを使用してHuffyuvでAVI2.0(720x480)+タイムコードで出力したファイル … %%0.avi
    • タイムコードファイル … %%0.avi.txt
    • WAV出力(PCM) … %%0.wav
    • チャプターファイル … %%0.txt
  • 出来る物
    • MKV … 720x480 AR4:3 VFR (H264 + Vorbis + Chapter)

入力ファイル(%%0)は日本語ファイル名は不可。
出力ファイル(%%1)は日本語OK。

cmdex.txt

:MKV/AVC(Chapter)
@echo off
set IN=%%0
set OUT=%%1

rem 音声のノーマライズ
waveflt2 -normal -2.0 "%IN%.wav" "%IN%_nm.wav"

rem AviSynthスクリプト作成
echo OpenDMLSource("%IN%.avi") > "%IN%.avs"
echo ConvertToYV12()           >>"%IN%.avs"
echo return last               >>"%IN%.avs"

rem エンコード
oggenc -b 128 "%IN%_nm.wav" -o "%IN%.ogg"
x264 -q 23 -b 1 --direct spatial -o "%IN%.mp4" "%IN%".avs --threads auto
mkvmerge -o "%IN%_out.mkv" --timecodes "1:%IN%.avi.txt" --aspect-ratio 1:4/3 
         -A "%IN%.mp4" "%IN%.ogg" --chapter-language jpn --chapters "%IN%.txt"
move /y "%IN%_out.mkv" "%OUT%.mkv"

rem 一時ファイルを削除(ごみ箱)
recycle -y "%IN%.avs"
recycle -y "%IN%.ogg"
recycle -y "%IN%.mp4"
recycle -y "%IN%_nm.wav"

エンコード(mp4)

某PS3が出たのでmp4の作成例も追加。(^^;
PS3ではHigh Profileが(今のところ?)扱えないようなのでx264.exeのオプションに--level 4を加えてください。
→ファーム1.8からHigh Profile Level4.2まで対応したようです。
PCからの転送はIISAN HTTPDなどでWeb鯖立ててブラウザで転送するといい感じ。

  • 準備
    ソースファイルはmkvの時と同じ。

  • ツール
    mp4作成の為のツールとしてmp4boxtc2mp4を用意します。
    mp4boxをGUIで操作したい場合はYAMBを利用してください。
    tc2mp4はVFR作成用です。
    ここに貼ってあるtc2mp4はファイル名のフルパス対応などの修正がしてあります。
    AACエンコーダはNeroAacEncを使用してみます。

  • 出来るもの
    • MP4 … 720x480 AR4:3 VFR (H264 + AAC + Chapter)

入力ファイル(%%0)は日本語ファイル名は不可。
出力ファイル(%%1)は日本語OK。

cmdex.txt

:MP4/AVC(Chapter)
@echo off
set IN=%%0
set OUT=%%1

rem 音声のノーマライズ
waveflt2 -normal -2.0 "%IN%.wav" "%IN%_nm.wav"

rem AviSynthスクリプト作成
echo OpenDMLSource("%IN%.avi") > "%IN%.avs"
echo ConvertToYV12()           >>"%IN%.avs"
echo return last               >>"%IN%.avs"

rem エンコード
NeroAacEnc -br 128000 -if "%IN%_nm.wav" -of "%IN%.m4a"
x264 -q 20 -b 1 --level 4 -o "%IN%.mp4" "%IN%".avs --threads auto

tc2mp4 -i "%IN%.mp4" -t "%IN%.avi.txt" -o "%IN%_vfr.mp4"
mp4box -add "%IN%.m4a" "%IN%_vfr.mp4"
mp4box -par 1=1920:2160 -chap "%IN%.txt" -lang jpn "%IN%_vfr.mp4"
move /y "%IN%_vfr.mp4" "%OUT%.mp4"

rem 一時ファイルを削除(ごみ箱)
recycle -y "%IN%.avs"
recycle -y "%IN%.m4a"
recycle -y "%IN%.mp4"
recycle -y "%IN%_nm.wav"

※tc2mp4はこのページに貼ってある修正版を使用しています。

画素アスペクト比(Pixel Aspect Ratio)の設定値

DAR(Display Aspect Ratio)を4:3、画素数が720*480の場合、

par_x = DAR_x * hight = 4 * 480 = 1920
par_y = DAR_y * width = 3 * 720 = 2160

となり、-par 1=1920:2160 (or 8:9)を設定する。

AviUtl用x264出力プラグイン(mp4/mkv)

x264出力(mp4/mkv)プラグインが可変フレームレート出力のページに置いてあります。
CFR,VFR(itvfr使用)での出力が出来ます。

自動フィールドシフト(afs)用の出力プラグインはSeraphy氏が公開しています。

VFR出力用CLI(AviSynthで使用する場合)

それぞれのプラグインに x264itvfr.exe および x264afs.exe が付属しています。






添付ファイル: filetc2mp4_20060613_pom20061203.zip 4952件 [詳細] fileMP4Box-0.4.3_20061115.zip 2849件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: Mon, 18 Jun 2007 14:30:46 JST (6150d)