ffmpegで1080iのMPEG2から480iのDVD-Videoを作る

難しかったのでメモ。もっと簡単な方法があったら教えてください。

前提

作り方

$ ffmpeg -i 1080i.mpg -vf yadif=1,scale=720:480,tinterlace=4 -target ntsc-dvd -flags +ilme+ildct dvd.mpg
$ export VIDEO_FORMAT=NTSC                  # ←この環境変数がないとdvdauthorが怒る
$ dvdauthor -o dvd.d/ -t -a 2ch+ja dvd.mpg  # ←VOBを作る
$ dvdauthor -o dvd.d/ -T                    # ←TOCを作る
$ genisoimage -dvd-video -o dvd.iso dvd.d/  # ←isoを作る

覚書き

ffmpegのオプション

ffmpegのマニュアルによるとdvd用のソースを作るのは
ffmpeg -i 1080i.mpg -target ntsc-dvd dvd.mpg
だけでいけそうなことが書いてあるが、実際にはプログレッシブの映像(480p, 29.97fps)が生成された。DVD-Videoはインターレースなのでインターレースの映像(480i, 29.97fps)を生成したい。そのため以下のオプションを付けた。詳しくはマニュアルを見てね。

-vf yadif=1,scale=720:480,tinterlace=4
インターレース解除(1080i, 29.97fps → 1080p, 59.94fps)してリサイズ(1080p, 59.94fps → 480p, 59.94fps)してインターレース化(480p, 59.94fps → 480i, 59.94fps)する。
yadif=1するとインターレース解除されてフレームレートが倍になる。
tinterlace=4するとインターレース化されるがフレームレートは半分にならないので注意。
-target ntsc-dvd
https://github.com/FFmpeg/FFmpeg/blob/master/ffmpeg_opt.c#L2615
ソースによれば以下のオプションと同じらしい。
-c:v mpeg2video -c:a ac3 -f dvd -s 720x480 -r 30000/1001 -pix_fmt yuv420p -g 18 -b:v 6000000 -maxrate 9000000 -minrate 0 -bufsize 1835008 -packetsize 2048 -muxrate 10080000 -b:a 448000 -ar 48000
-flags +ilme+ildct
FFmpeg FAQ, http://ffmpeg.org/faq.html#Interlaced-video-looks-very-bad-when-encoded-with-ffmpeg_002c-what-is-wrong_003f
ilme(interlaced motion estimation), https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/options_table.h#L82
ildct(use interlaced DCT), https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/options_table.h#L77
このオプションをつけるとインターレース付きでエンコードされるっぽい。映像がインターレースに変換されるわけではない。なのでプログレッシブの映像ソースに対してこのオプションを付けると、中身がプログレッシブのなのにインターレースとマークされた映像が出力される? あるいは映像ソースがインターレースなのにこのオプションを付けないと、中身がインターレースなのにプログレッシブとマークされた映像が出力される?
dvdauthor

xmlを書いて一発で作る方法と、コマンドラインからぼちぼち作る方法があるらしい。今回はxmlを書くのが面倒なのでコマンドラインからぼちぼち作った。
単にmpgをDVD-Videoにしたいだけなのに、マニュアルを見ると難しいことばかり書いてあって勘弁してほしい。

genisoimage

mkisofsはgenisoimageになったらしい。