ffmpeg で DVD-VIDEO用 ファイルをいい感じに生成する方法

ffmpeg とはオープンソースの動画変換(エンコード・デコード・コンバーター)ソフトウエアの1つです。
多くの動画形式に対応しています。
ここでは動画画像ファイルをDVD-Video用に変換する(ほぼ)決定版をメモしておきます。

ここで紹介していスクリプトは基本的に Ubuntu(Linux)用コードです。複雑なコードはWindowsなどでは正しく機能しませが,参考にはなるでしょう。

動画圧縮アルゴリズムは MPEG2Videoで 音声圧縮は AC3 というのを使うとほとんど全てのDVD-Playerで再生できるフォーマットになります。(これ以外の圧縮方式でもDVD-Videoは一応作成出来るのですが,再生できない可能性が高いです。)

ffmpeg -y -i 動画ファイル.avi -pass 1 -threads 4 -target ntsc-dvd -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 -an /dev/null && ffmpeg -i 動画ファイル.avi -pass 2 -threads 4 -target ntsc-dvd -acodec ac3 -ar 48000 -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 出力動画ファイル.mpg

動画ファイル.avi が入力ファイル名2ヶ所ある。avi以外にも mpg や wmv など ffmpeg がサポートしている動画ファイルを指定出来る。

CPUの数分だけ スレッド数で処理速度を高速化。
これは,4CPU用設定 -threads 4 です。IntelのCore 2 Quadや Core i7 など。4コアCPUや4CPUなど。AMDの x4 系。
Core i7はHT(ハイパースレッディング)で8スレッドなので -threads 8でも多少速度アップするかも。
デュアルコアCPUなら -threads 2 は Core 2 Duo や Pentium Dual Core や PentiumDなど。 2コアCPUや2CPUなど。AMDの x2 系
シングルコアなら,-threads 2 は書かない。Pentium 4 HTなら,-threads 2でも少し効果があるだろう。
※CPU(コア)数以上を指定しても速度は変わらない。(計測した。)

ビットレートは指定していないが,無理してDVD 1枚に動画を詰め込むなどの必要がないなら,下手に指定するよりも 容量的にも画質的にもいいと思われる。

ビットレートは基本的に可変長となっています。必要な分だけ確保します。
上限の指定ができますが,特に上限を指定しなくても,5000kを越えることはあまりにないみたいです。
上限の指定は -b 5000k などを追加してやるといけます。通常は -b 5000k で十分。これを減らせば画質が落ちるが,容量を減らすことができる。(1枚のDVDに長時間録画できる。)

オーディオのビットレートは -ab 192k とかで指定できる。指定しなければ -ab 448k になるっぽい。減らして音質を下げてもサイズはあまり変わらない(映像が巨大なため)ので気にしなくてもいい。

画面の縦横比のアスペクト比は,-aspect 4:3 以外に -aspect 16:9 でもいける。

音量変更方法: -vol 460 460なら,音量アップ。 オプションをつける。 なお256 が同じ音量 これより増やせば,音量アップ。減らせば音量ダウン

ffmpeg -y -i 動画ファイル.avi -pass 1 -threads 4 -target ntsc-dvd -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 -an /dev/null && ffmpeg -i 動画ファイル.avi -pass 2 -threads 4 -target ntsc-dvd -acodec ac3 -ar 48000 -vol 460 -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 出力動画ファイル.mpg

DeVeDeと言うソフトでタイトル付きDVD-Videoを簡単につくれる。ただし動画のエンコードの指定が面倒で,間違うと再生できなくなるので,注意が必要。上記の方法で用意した動画ファイルならば,DeVeDeでエンコード処理をせずにそのまま使える。

DeVeDeでこれらの MPG ファイルを指定する場合は,動画のプロパティ(File Properties)で Advavance Options を開き Misc から This file is already a DVD/xCD-suitable MPEG-PS file のチェックを入れることで,DeVeDeでエンコード処理をしないで済む。(これの方がエンコード設定間違いもなく確実でしっかりした画質・音質で出来る。)

これなら,DeVeDeでエンコードしないので,DeVeDeでの作り直し作業が早く,動画エンコード失敗しても,失敗した動画ファイルのみを対象とすればよいので,修正も早い。など利点は多い。
※メニュー・タイトル画像を NTSC ににするのを忘れずに。(Menu Options ボタンか変更できる。)

大量の動画ファイルをすべてエンコードする方法:

大量にある動画ファイルをエンコードするのは時間がかかります。それが大量にあると,いちいち終わるのを待って実行なんて時間がもったいないです。
大量の動画ファイルを1コマンドで全て順番にエンコードする方法を書きます。

大量の wmv 形式ファイルなら
for nf in *.wmv; do ffmpeg -y -i $nf -pass 1 -threads 4 -target ntsc-dvd -acodec ac3 -ar 48000 -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 -an /dev/null; ffmpeg -i $nf -pass 2 -threads 4 -target ntsc-dvd -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 ${nf%.wmv}.mpg; done

大量の avi 形式ファイルなら
for nf in *.avi; do ffmpeg -y -i $nf -pass 1 -threads 4 -target ntsc-dvd -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 -an /dev/null ; ffmpeg -i $nf -pass 2 -threads 4 -target ntsc-dvd -acodec ac3 -ar 48000 -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 ${nf%.avi}.mpg; done

aviやwmvが複数ある場合は
for nf in *.wmv; do ffmpeg -y -i $nf -pass 1 -threads 4 -target ntsc-dvd -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 -an /dev/null ; ffmpeg -i $nf -pass 2 -threads 4 -target ntsc-dvd -acodec ac3 -ar 48000 -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 ${nf%.wmv}.mpg; done ; for nf in *.avi; do ffmpeg -y -i $nf -pass 1 -threads 4 -target ntsc-dvd -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 -an /dev/null ; ffmpeg -i $nf -pass 2 -threads 4 -target ntsc-dvd -acodec ac3 -ar 48000 -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 ${nf%.avi}.mpg; done

とすれば,OK。他の画像形式ファイルがある場合も,同様に ; でつないでいけばいい。
これなら長時間かかるエンコーディングの場合でも放置しておけば全て終わる。

これらは2パスエンコードなので画質重視だが,エンコーディングに2倍の時間がかかる。
時間が無い場合や,そこそこの画質でいいなら,1パスのみのエンコードでもいい。(1パスでもそんなに悪くは無い。)
-pass 2 の部分だけでいける。 -pass 1 を全て取って, -pass 2 の文字を消せばいける。

たとえば,こんな感じ:
ffmpeg -i 動画ファイル.avi -threads 4 -target ntsc-dvd -acodec ac3 -ar 48000 -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 出力動画ファイル.mpg

wmv ファイル全て(1パスモード):
for nf in *.wmv; do ffmpeg -i $nf -threads 4 -target ntsc-dvd -acodec ac3 -ar 48000 -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 ${nf%.wmv}.mpg; done

avi ファイルなら
for nf in *.avi; do ffmpeg -i $nf -threads 4 -target ntsc-dvd -acodec ac3 -ar 48000 -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 ${nf%.avi}.mpg; done

動画の一部分を切り出すなら
4分00秒から 7分37秒までなら
-ss 00:04:00 -t 00:03:37
を追加で指定する。

ffmpeg -i 入力動画.avi -ss 00:04:00 -t 00:03:37 -target ntsc-dvd -vcodec mpeg2video -s 720×480 -aspect 4:3 -r 29.97 -acodec ac3 -ar 48000 出力動画.mpg

-ss はエンコード開始時間。 -t はエンコードする長さ。 7分37秒までなら,4分を引いた 3分37秒の指定。
ただし,wmvだと,なぜか頭の音が途切れる。(バグ?)
wmvなら,Windowsでムービーメーカーを使って加工するほうがいいっぽい。ムービーメーカーでの出力時に最大の画質で出力するなどで対応。ムービーメーカーならwmvからwmvへの変換なので劣化度合いも少ない(はず)。

ffmpeg以外にも mencoder というのを使っても同様にエンコードが出来る。
ffmpegでは出来ない動画の連結を mencoderでは出来る。

たとえば p1.mpg p2.mpg p3.mpg を 連結して out.mpg にするなら
mencoder -ovc copy -oac copy p1.mpg p2.mpg p3.mpg -o out.mpg
とすると出来るらしい(未確認ですが)。

comments

コメントを残す