AviUtlとffmpegでDVD-Videoの奇怪な仕様に挑む
とある事情で、とある映像作品の編集とDVD出力を任されました。
編集に使用しているのはAviUtl。
今回はAviUtlからできるだけ画質と時間をセーブしてDVD出力するためにいろいろ試した記録をつづります。
市販のDVDプレイヤーで再生できるようにするという制約があるので、DVD-Video仕様で出力します。このDVD-Videoというのがどんな仕様なのかというとWikipediaを見れば大体わかります。
映像フォーマット:MPEG2
画面サイズ:720x480 (NTSC)
アスペクト比:4:3または16:9
あまり古い時代の映像事情に詳しくない私はここで引っ掛かります。
「なんで画面サイズは720x480で4:3として策定されているのにアスペクト比が16:9も選べるんだ?」と。単純にレターボックスをつけるだけでいいのなら4:3だけで決めちゃえばいいじゃないか。
実は16:9の場合でも720x480の画面はフルで使い、アスペクト比情報を別に書き込んでおくことで、再生機器側で横に引き延ばしするんだそうです。なんという……
しかしここで問題が発生します。
AviUtl側では1920x816のシネスコサイズで編集しているという点です。
つまり、MPEG2のファイルとしては720x480で出力し、DVD書き出しの際は16:9として記録しつつ、シネスコサイズ対応用のレターボックスをあらかじめつけるというあまりにもあまりな手段を取らざるを得ないわけです。
そこで、これだけ柔軟な出力をするために、ffmpegを活用することにしました。
AviUtlからのffmpegを通じた出力にはffmpegOutというAviUtlプラグインを利用させてもらいます。mp4出力のx264guiExで有名なrigayaさんの公開されているソフトウェアです。
出力設定はこんな感じです。
出力コマンドです。
-target ntsc-dvd -vcodec mpeg2video -vf "scale=720x363,pad=720:480:0:58" -r 29.97
キモは-vfオプション欄です。-vfはffmpegにおいて映像にフィルタをかけるための引数で、ここでサイズ変換等を行います。様々なフィルタをカンマで区切って入力すると順番に実行されていきます。
①scale
名の通り、単純に入力映像を指定サイズにスケールします。アスペクト比が変わればストレッチも入ります。ここでは入力映像の1920x816から720x363にリサイズしています。前述のDVD-Video仕様で、16:9として記録して、再生機器側で横引き延ばしされた場合にアスペクト比が1920:816になるよう計算した値が363です。小数点以下は適当に丸めましたが。
②crop
レターボックスを追加するために使用しています。"720:480"は最終的な映像サイズ、あとの"0:58"は左右に0px、上下に58pxずつ黒帯を追加するという意味です。
あとのオーサリングにはDVDStylerを使用しました。適切な形式にエンコードされていれば無変換でDVDに書き込めるので、多重にエンコードすることを避けることができます。