Hatena::ブログ(Diary)

eggshell blue

2008-03-15 ついでに動画ファイルフォーマットやffmpegとの関係を纏めてみた

コマンドラインからffmpegを使ってみる

| コマンドラインからffmpegを使ってみるを含むブックマーク コマンドラインからffmpegを使ってみるのブックマークコメント

バイナリ

とりあえずバイナリがなければ話にならないので、適当にHDDの中を探してみるか、グーグル先生に尋ねてみましょう。

もしなければ、 FFmpegダウンロード お気に入りの動画を携帯で見よう からダウンロードさせてもらいましょう。定期的にffmpegの最新版をSVNからチェックアウトしてコンパイル・配布してくれています。携帯動画変換君に付属しているものを使っても良いのですが、如何せんビルド日時が古く*1、新たにダウンロードし直した方がいいかと。

ダウンロードしたアーカイブを解凍し、適当なフォルダに移動します。可能ならパスの通ったフォルダ(C:\windows とか)にコピーするのが望ましい。

尚、最近の配布分については3G携帯向けlibamrは含まれていません。非GPLなコードが使われているようなので、再配布禁止になってしまったようです。詳しくは:

FFmpeg rev.11662 ダウンロード お気に入りの動画を携帯で見よう

404 Not Found


H.264/AACに変換

とりあえず、何かしら適当なムービーファイルを用意しましょう。なければ適当に一般公開されているようなムービーをネットから持ってきましょう。後述しますが、最新版のffmpegでは、特にコーデック指定形式が大幅に変わっているので古い文献はほとんど役に立ちません。

H.264
libx264
AAC
libfaac
mp3
libmp3lame

あたりは押さえておく必要があります。

例えば、shunirr.org の中の人が書いていたように、wmv/wma 形式の wmv ファイルをH.264/AAC形式のmovファイルに2-pass encodingで変換するには、スタートメニューからファイル名を指定して実行を開き、cmdと打ち込んでコマンドプロンプトを開きます。そこに

ffmpeg -i hoge.wmv -vcodec libx264 -vb 400k -acodec libfaac -ac 2 -ar 48000 -ab 64k -pass 2 fuga.mp4

を打ち込みます。これで一発。 -vb は映像側ビットレートの指定なので、高画質でエンコードしたいなら適当な数字に置換してやればOK。


対応形式とコマンドのお話

基本的には出力形式を指定してやれば、入力コーデック形式についてはファイルのFour CC*2を利用してほぼ自動で判別してくれるようです。ただし、コンテナの形式に限っては、入力時、出力時に指定された拡張子を基に判断する模様*3

対応コンテナ/コーデック形式は

ffmpeg -formats

で表示が可能です。が、随分多いので

ffmpeg -formats > format.txt

として外部ファイルに出力してやった方が見やすいです。Cygwin入ってるなら |less でもおk。

この出力内容は大きく二つに分かれており、

File formats:

が対応コンテナ(ファイルフォーマット)の種類、

Codecs:

が映像/音声コーデックの種類を表します。

頭に DEVSDT とかいろいろ並んでいますが、最初3文字の意味は

D
デコード可能(変換元として入力対応)
E
エンコード可能(変換先として出力可能)
V
ビデオ(映像)
A
オーディオ(音声)

ですので、ここから目的のコーデックが対応しているかどうか、および引数指定時のコーデック名称をチェックします。

例えばH.264の場合は

 D V DT h264

なのでビデオフォーマットとしてデコード可能、ただしエンコードは不可、となります。一方、libx264では

  EV    libx264

ですので、ビデオフォーマットとしてでコード可能、ただしデコードは不可、となります*4

これはAAC、mp3でも同じで、デコード時は

 D A    mpeg4aac
 D A    mp3

ですがエンコード時には

  EA    libfaac
  EA    libmp3lame

で対応されます。

flv+mp3に変換したいなら、

ffmpeg -i hoge.wmv -vcodec flv -vb 400k -acodec libmp3lame -ab 128k -pass 2 fuga.flv

とかで変換可能。

映像/音声の一方だけ変換するため、コーデックを変換する必要がない場合は、

-vcodec copy
-acodec copy

で変換元ファイルの形式がそのまま引き継がれます。


ヘルプ

ネット上には種々の解説サイトがあるので、そちらをどうぞ。ただし、最終はやはり

ffmpeg -h

なのですが、量がものすごいので転載は割愛。

携帯動画変換君における、最新版のffmpegでの相違点はこちらを。


enjoy!

*1:約2年ちょっと前。動画コーデックのアルゴリズムはそう変わらないとはいえ、バグフィクスとか機能向上は相当数手が加えられていると思われ。

*2:拡張子みたいなもので、ファイル内部に埋め込まれたコーデック形式を特定する4文字の識別符号。詳しくは www.FOURCC.org - Video Codecs and Pixel Formats を参照。

*3:-f オプションで出力形式の強制指定も可能。

*4:ただし、libx264でエンコードしてもデコード時はh264として認識されるのであまりこの区別は意味がない。