ffmpegで高品質なDVD-Video規格の動画を作成(一括変換用バッチファイルもあるよ)

環境:Windows10 64bit
参考:[ffmpeg で DVD-VIDEO用 ファイルをいい感じに生成する方法](https://blog.kcg.ne.jp/s2node/2009/07/14/ffmpeg-%E3%81%A7-dvd-video%E7%94%A8-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%81%84%E3%81%84%E6%84%9F%E3%81%98%E3%81%AB%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/ "https://blog.kcg.ne.jp/s2node/2009/07/14/ffmpeg で DVD-VIDEO用 ファイルをいい感じに生成する方法")
ffmpegのスレッド数指定ですが、昨今16スレッドのCPUなどもザラにあるため、スレッド数を指定せずffmpegに任せたほうが良いんじゃないかという気がします。

それから[こちらのサイト](https://freesoft.tvbok.com/freesoft/author/dvdstyler-mpeg2.html "DVD準拠のmpgファイルを利用した無変換オーサリングの方法")によると**このままDVDStyler等のオーサリングソフトに投げ入れても家電で再生できない可能性があるらしい**ので、[こちらのサイト](https://freesoft.tvbok.com/freesoft/author/dvdstyler-mpeg2.html)の通り、生成した動画をセグメント付きVOBファイルに変えてから扱うといいと思います。

# とりあえずffmpeg
それぞれ、コマンドと、ドラッグ&ドロップで一括変換するバッチファイル用のスクリプトを掲載。
コマンドの場合はコマンドプロンプト等にコピペしてファイル名のところを書き換え
バッチの場合はメモ帳かなんかにコピペして、`適当な名前.bat`で保存し、保存したbatファイルに動画をドラッグ&ドロップすると変換された動画が生成されます。
**動画のアスペクト比が16:9じゃないときは各自`16:9`の部分を書き換えてください。
## 1Pass VBRのとき
### コマンド
```powershell
ffmpeg -i "元動画のファイル名" -c:v mpeg2video -vf "scale=720:480,format=yuv420p,fps=30000/1001" -vsync 1 -target ntsc-dvd -aspect 16:9 -b:v 6000k -maxrate 9000k "出力ファイル名.mpg"
```
### 一括変換バッチ
```powershell
cd /d %~dp1
:loop
if "%~1" == "" goto end

ffmpeg -i %1 -c:v mpeg2video -vf "scale=720:480,format=yuv420p,fps=30000/1001" -vsync 1 -target ntsc-dvd -aspect 16:9 -b:v 6000k -maxrate 9000k "%~dpn1.mpg"

shift
goto loop
:end
```

## 2Pass VBRのとき
### コマンド
```powershell
ffmpeg -i "元動画のファイル名" -c:v mpeg2video -pass 1 -vf "scale=720:480,format=yuv420p,fps=30000/1001" -vsync 1 -target ntsc-dvd -aspect 16:9 "出力ファイル名.mpg" && ffmpeg -y -i "元動画のファイル名" -c:v mpeg2video -pass 2 -vf "scale=720:480,format=yuv420p,fps=30000/1001" -vsync 1 -target ntsc-dvd -aspect 16:9 -b:v 6000k -maxrate 9000k "出力ファイル名.mpg"
```
### 一括変換バッチ
```powershell
cd /d %~dp1
:loop
if "%~1" == "" goto end

ffmpeg -i %1 -c:v mpeg2video -pass 1 -vf "scale=720:480,format=yuv420p,fps=30000/1001" -vsync 1 -target ntsc-dvd -aspect 16:9 "~dpn1.mpg" && ffmpeg -y -i %1 -c:v mpeg2video -pass 2 -vf "scale=720:480,format=yuv420p,fps=30000/1001" -vsync 1 -target ntsc-dvd -aspect 16:9 -b:v 6000k -maxrate 9000k "~dpn1.mpg"

shift
goto loop
:end
```

# 解説

### 2Passエンコード
VBRとは可変ビットレートのこと。動きが多いところにたくさんデータを使い、動きの少ないところでデータ量を減らす。
2Passエンコードを行うと、1回目で動画の解析を行ってから2回目でエンコードするので、2倍の時間がかかるが効率よく圧縮できる。DVDは4.7GBと容量が限られているためおすすめする。
### `-target ntsc-dvd`
NTSCとは日本で使われている映像放送規格。
このオプションは、[このサイト](https://hikaen2.hatenablog.com/entry/20150201/1422773879 "ffmpegで1080iのMPEG2から480iのDVD-Videoを作る")によると
`-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`
と同じらしい。これはDVDの規格に沿ったものである。一部書いたコマンドと被ってる部分があるが、自分で書いた方の記述が優先されるようなのでOK。
### `fps=30000/1001`と`-vsync 1`
一応`target ntsc-dvd`の中でもフレームレートを29.97fps(=30000/1001fps、DVDの規格)にするために`-r 30000/1001`としているが、これだと音ズレすることが多々あるので、`fps=30000/1001`として強制的に29.97fpsにし、`-vsync 1`でズレないように補強している。
### 2pass目にだけ存在する`-y`
`-y`は、同名のファイルが存在したときに強制的に上書きするオプション。だって、1pass目でできたファイル、いらねえじゃん。
大体どのサイトでも1Pass目は`NULL`とかそういう名前にして保存しているが、これが後で残るので、だったら出力ファイル名と同じに名前にしておけば2Pass目でついでに消してくれるよね、という構文になっている。

# さいごに
どうせffmpegのことだしどうせエラー吐くんで自分で修正してください。頑張れ！
あとDVDに焼くときは必ず生成したmpgファイルを[こちらのサイト](https://freesoft.tvbok.com/freesoft/author/dvdstyler-mpeg2.html "DVD準拠のmpgファイルを利用した無変換オーサリングの方法")の通りにセグメント付きVOBファイルに変換してから作業してください。そのうちVOB生成まで一通りバッチファイルで自動化するつもり。