[ffmpeg]動画から音声を抜き出す

副音声を含む動画から、主音声・副音声を指定して音声ファイルを抜き出してみた。
まず、最初にffmpegでファイルを読み取って動画に含まれている情報を見てみましょう。

> ffmpeg -i Hogehoge.vob

すると、対応しているコーデックの種類やら何やらがゴチャゴチャと出てきますが、最後がこんな感じになっています。

Input #0, mpeg, from 'Hogehoge.VOB':
  Duration: 00:00:05.92, start: 0.280633, bitrate: 4644647 kb/s
    Stream #0:0[0x1bf]: Data: dvd_nav_packet
    Stream #0:1[0x1e0]: Video: mpeg2video (Main), yuv420p(tv), 720x480 (後略)
    Stream #0:2[0xa0]: Audio: pcm_dvd, 48000 Hz, 2 channels, s16, 1536 kb/s
    Stream #0:3[0x81]: Audio: pcm_dvd, 48000 Hz, 2 channels, s16, 1536 kb/s
At least one output file must be specified

最終行(7行目)は「出力ファイルを指定してね」という警告なので無視。
重要なのは「Stream」で始まる3~6行目。
Stream #0:1が動画でmpeg2でエンコードされた動画。
Stream #0:2が音声で主音声(日本語)
Stream #0:3が音声で副音声(英語)
というような感じでした。

そこで、主音声だけを抜き出してみます。
出力するストリームを指定する時に使うのがmapオプションです。

> ffmpeg -i ./Hogehoge.VOB -acodec libmp3lame -ab 320k -ac 2 -map 0:2 Hogehoge_0_2.mp3

オプション指定は下記の通りです。
-iで入力するファイル(Hogehoge.vob)
-acodec でMP3圧縮(libmp3lame、LAME MP3エンコーダ)
-ab でビットレート(320k)
-ac でチャンネル数(2チャンネル=ステレオ)
-map で出力するストリーム(0:2 Stream #0:2[0xa0]: Audio…)

そして、最後に出力するファイル(Hogehoge_0_2.mp3)を指定しています。
最後のファイル指定のところで、コーデックと矛盾する拡張子だとうまく再生されないようです。

ちなみに、動画と主音声だけにするのはこんな感じです。

> ffmpeg -i ./Hogehoge.vob -vcodec copy -acodec libmp3lame -ab 320k -ac 2 -map 0:1 -map 0:2 Hogehoge.mpeg

参考にしたサイト