最新FFmpeg †
最新版のFFmpegのマニュアルです。
公式:FFmpeg Documentation(日本語版)
(以下個別ページ)
作者さんの意向で各ページの最大サイズは8388608バイト規制となっているため、各オプションごとにページを分けてあります。
まえがき †
ここでは携帯動画変換君への最新のFFmpegの導入とそのオプションについて説明します。
現在でもFFmpegは継続的に開発が進められており、新しいフォーマットに対応したバージョンがリリースされています。
これによりポータブルデバイスに標準的に利用されるつつあるH.264コーデックの詳細なオプションを指定したエンコードや、
動画配信サイトなどで利用されている映像部分がVP6でエンコードされたFLVファイルのデコードなどが可能になりました。
しかし変換君に同梱されている以前のFFmpegとはコマンドの仕様が異なるため、単にffmpeg.exeファイルを差し替えるだけでは利用できません。
最新ffmpegの入手方法 †
最新版のFFmpegは、こちら や こちら や こちら や こちら や こちら や こちら や ※こちら※
や こちら などでビルド済みのバイナリを入手するか、ソースコードを入手して自分でビルドしてください。
コンパイル方法は 猫とモブログと動画ブログのブログ , M. a. Factory社長日誌 , お気に入りの動画を携帯で見よう , X5-452's x264_L-SMASH builds for Windows に詳しく載っています。
なおLAMEは同梱のlibtoolのバグでホームディレクトリのパスに空白文字があるとメイクできないので注意。
また、オプションの種類・効果については、ここのMPlayerのオプション一覧 等検索すれば概ね見つけられます。
誰でも簡単にffmpegをbuildできるようLibraryをパッケージ化した Easy Build Libpack for ffmpeg は ※こちら※ 。
※ ffmpeg-DEVの中で対立がおこり、"ffmpeg" と "Libav" に分裂しました。
※ バイナリ名は両方とも"ffmpeg.exe"ですが、更新や方向性の違ったものになるようです。
※ ffmpeg-mtは、Libavをベースにマルチスレッド化したものです。
※ 使う側としては、選べる自由度が増して喜ばしい事です。
※ 携帯電話用(docomo等)に libx264 を使用する場合、-profile baseline が必須になりました(2011/05以降のバイナリ)。
※ "-profile baseline" = (coder=0 bf=0 flags2=-wpred-dct8x8 wpredp=0)
※ win64版は、No Support is libvpx。
※ ffmpeg も mplayer/mencoder も ffdshow もベースは libavcodec (各種デコードや mpeg1, mpeg2, xvid 等のエンコードに利用) で一緒です。
従って、これらのコーデックについて mencoder、ffmpeg、ffdshow の VFW インターフェース等がカバーする設定の範囲は大体同じ (オプションの名称は異なるが) で、
こういったソフトウェアのマニュアルや設定画面に関する解説記事を探すことで、かなりのオプションの意味や効果を見つけられます。
また、libx264 (H.264 エンコード)、lame (MP3 エンコード)、faac (AAC エンコード) 等の ffmpeg がリンクしているライブラリには、
通常ライブラリの開発本家による純正フロントエンド (x264.exe, lame.exe, faac.exe) が存在します。ffmpeg が内部でこういったライブラリを使っている場合は、
オプション周りもこれらの純正フロントエンドに対応させている場合が多いので、こういった純正フロントエンドのコマンドラインヘルプも参照してください。
導入のメリットと注意点 †
導入のメリット
- 旧FFmpegに比べてより詳細なオプションを設定することが出来ます
- 入力・出力フォーマットが多数追加されました
導入のデメリット
- 新FFmpegでは既存の携帯電話で対応している仕様のmp4/3gpファイルを直接出力できないかもしれません
(つまり変換君に動画ファイルを放り投げて、出てきたファイルをそのまま携帯に転送しても再生できない可能性があります)
- オプションや引数の書式が変更されたため、変換君に同梱のデフォルトiniファイルのエンコード設定が使用できません
- 変換君に同梱されている ffmpeg は、作者さんによる独自の機能追加等によって携帯機器向けの変換や
変換君との連携に使いやすいように修正されています。
ffmpegを入れ替えると、この機能 (の一部) は使えないかもしれません
(一例として、変換中に「中断」ボタンを押してもエンコードが即座には停止されません)。
導入にあたっては、特に、FFmpeg自体は特定の携帯電話やポータブルデバイスなどのための専用エンコードツールではないこと、
また携帯動画変換君に同梱の各種iniファイルは、そのままでは最新のFFmpegでは利用できないことを念頭においてください。
従って、最低限iniファイルを最新のFFmpegに対応させるために書き換える必要があります。FFmpegはCUIベースの(コマンドラインで利用する)ツールなので、
一般的なCUIベースのツールの使い方(コマンド/オプションの指定方法や)についての常識とFFmpegの各オプションに関して検索で調べるくらいの努力は必要です。
このページの内容はそれほどハードルが高い作業ではないですが、あくまでこういった多少の手間をかけてでも最新のffmpegを使いたい人向けです。
変換君同梱の設定で不満なく使えている方、面倒くさいのが嫌な方、内容がいまいち理解できない方にはお勧めしません。
最新FFmpegで利用可能なフォーマット †
最新FFmpegではデコードおよびエンコードできるフォーマットが多数追加されたため、それにともない多くファイルフォーマットおよびコーデックの名称が変更されました。
この一覧はFFmpeg.exeの本体があるディレクトリでコマンド「ffmpeg -formats」を実行することで確認出来ます。
変更されているのはファイルフォーマット(FFmpegのコマンド-fの引数) およびコーデック (FFmpegのコマンド-vcodecおよび-acodecの引数) の一部です。
また、変換君同梱ffmpegの固有オプションも使用できなくなります。
※-formatsコマンドは旧FFmpegも同様に使用できます。新FFmpegのコマンドは別ページのメインオプションを参照してください。
例)ファイルフォーマットに関する変更の例
-f ipod もともとは変換君付属ffmpegの固有オプションでした。
r12458以降オフィシャルに使用可能になりました。
r12458以前(未満です)のffmpegにはありません。
※なお、ffmpeg の -f オプションを設定しても作成した動画が手持ちの機器で認識されない場合は、ffmpeg から出力したファイルが機器の対応している規格に沿っていません。
この場合は、ffmpeg で一度 mp4 や 3gp 等で書き出したあと、必要に応じて外部プログラム (NicMP4Box, ATOMChanger 等) で加工 (ヘッダ情報の書き換え等) してください。
もちろん ffmpeg が生成するファイルそのままで利用する機器が認識できればそれ以上の加工は(普通は)必要ありません。
例)コーデック名の変更
-vcodec xvid → -vcodec libxvid
-vcodec h264 → -vcodec libx264
-acodec mp3 → -acodec libmp3lame
-acodec aac → -acodec libfaac
※lib・・・libavcodec、lame・・・Lame mp3エンコーダ の意味で、
GPL準拠の内蔵している外部エンコーダ・デコーダの利用を明記する形で名称を変更しているようです
リビジョンによって利用可能な AAC エンコーダについて †
r18715 における FAAC の non-free 化と r19375 における ffmpeg のネイティブ AAC エンコーダの追加によって、
リビジョンにより AAC エンコーダの指定方法 (-acodec オプションの引数) が異なります。
以下の表にリビジョン範囲ごとに指定可能な値をまとめたのでこちらを参照してください。
リビジョン範囲 | 内蔵エンコーダ指定 | FAAC エンコーダ指定 |
---|
r19375以降 | -acodec aac (※1) | × (※2 利用に制限あり) |
---|
r18715〜r19374 | × (存在しない) | × (※2 利用に制限あり) |
---|
r9171〜r18714 | × (存在しない) | -acodec libfaac |
---|
r2342〜r9170 | × (存在しない) | -acodec aac (※3) |
---|
r2341以前 | × (存在しない) | × (FAAC 未サポート) |
---|
<上記表の記載に関する注意点>
(※1) r19375以降では、configure 時に無効にしない限りはデフォルトで利用可能です。
ただし、以下の (※3) の頃の -acodec aac 指定とは内部で利用されているエンコーダが異なります。
ffmpeg ネイティブエンコーダはまだ実験段階のため、ほか (FAAC, Nero, QuickTime/iTunes) と比べて品質が良くないです。
(※2) r18715以降のソースからコンパイルされ Web 上で再配布されている ffmpeg のバイナリでは
ffmpeg の配布条件による制限のため FAAC は利用できません (-acodec libfaac の指定はエラーになります)。
ただし、自分でソースからコンパイルし configure 時に --enable-libfaac --enable-nonfree で構成すれば
この範囲のリビジョンでも -acodec libfaac で FAAC が利用可能になります (この場合のバイナリは再配布不可)。
(※3) この場合、指定は -acodec aac ですが内部的には FAAC ライブラリのエンコーダが利用されています。
上記 (※1) にある ffmpeg のネイティブエンコーダとは異なりますので注意してください。
最新FFmpegでの重要な変更点 †
- オプションの使用方法
旧FFmpegとオプションの使用方法が大幅に変更されています。
特に同梱のiniに多数利用されていると思われる-maxfr, -fixaspect オプションは変換君付属ffmpegに固有のため、
オリジナル版である新ffmpegではデフォルトのiniファイルは使用できません。
新FFmpegのオプションの詳細は別ページのメインオプションやFFmpegリリースノートなどを参照して下さい。
例)オプションの仕様変更・追加・削除
-bitexact → -flags bitexact へ変更
-maxfr → 削除 (変換君付属ffmpegに固有のオプションのため)
-muxab → 同上
-muxvb → 同上
-fixaspect → 同上
-title → 削除 (最新版では引数の渡し方が変わったため)
(変換君同梱ffmpeg の日本語タイトル対応(mov/asf)は作者さん独自の拡張です
最新版ではmp4では-metadata title-jpn=の形で、
それ以外のフォーマットでは-metadata title=の形で渡す必要があります
日本語タイトルはUTF-8で渡す必要があります)
- ビットレートの指定方法
旧FFmpegでは映像・音声のビットレート(-b, -abの引数)はkbps単位での指定 (128kbps だったら 128 と指定)でしたが、
最新FFmpegではこれがbps単位になりました。また、k(キロ)、M(メガ) といったアルファベットが単位として認識されるようにもなりました。
例) 最新ffmpegでのビットレート指定の例
映像ビットレートを400kbpsにしたい場合: -b 400k または -b 400000 (⇔ 旧ffmpegでは -b 400)
映像ビットレートを1.5Mbpsにしたい場合: -b 1.5M または -b 1500k または -b 1500000 (⇔ 旧ffmpegでは -b 1500)
音声ビットレートを128kbpsにしたい場合: -ab 128k または -ab 128000 (⇔ 旧ffmpegでは -ab 128)
また、変換君付属のffmpegでは音声のビットレートは音声1chあたりのビットレートを指定していましたが、新FFmpegでは音声ストリーム全体のビットレートを指定します。
例) 音声が Stereo 2ch で 128kbps にしたい場合
新ffmpeg: -ac 2 -ab 128k (-ac の指定とは関わらず -ab は音声ストリーム全体のビットレートである 128k を指定します)
↑
|
↓
旧ffmpeg: -ac 2 -ab 64 (-ac 2 (2ch) なので -ab には 1ch あたりのビットレート (128÷2=64) を指定していました
一方同じ 128kbps でモノラル (1ch) の場合は -ac 1 -ab 128 のように指定する必要があり、
旧ffmpegでは同じ音声ビットレートでもチャンネル数によって -ab の指定値が変化していました)
最新FFmpegを使用したTranscoding.iniのカスタマイズ †
ここでは最新FFmpegの導入とTranscoding.iniのカスタマイズ方法を紹介します。
方法は数種類ありますが、旧・新両方のFFmpegを変換君のcoreフォルダに共在させる方法を推奨します。
これは既存の携帯電話の仕様に対する利便性が旧・新の両方にあるためです。
- 最新(使用したいバージョン)のffmpeg.exeを入手します
ここに記載してあるようなビルド済みのバイナリを配布しているWebサイトから入手してください
- 新しいffmpeg.exeをリネームします
(例)ffmpeg11870.exe、ffmpeg2.exeのように好きな名前で結構です
- 変換君のcoreフォルダにリネームした新しいffmpeg.exeをコピーします
- ダウンロードした時に pthreadGC2.dll が付属していた場合は、これも変換君のcoreフォルダにコピーします
(pthreadGC2.dll が付属していない、もしくは配布元で不要と記載されていた場合はこの手順はスキップ)
- coreフォルダにffmpeg(旧ver.)とffmpeg2(リネームした新ver.)とpthreadGC2.dll(必要な場合)が入った状態で準備完了です
※pthreadGC2.dllのバージョン違いで問題が起こることはまずないと思われますが、coresフォルダ内に既にpthreadGC2.dllが存在し、
入手したffmpegとセットになっていたpthreadGC2.dllと異なる場合は、一応もとのpthreadGC2.dllは名前を変更するなどして保存しておいてください。
(例1) AVI (xvid+mp3) の2passエンコード (新FFmpeg→ffmpeg2)
[Item0]
Title=新FFmpeg - AVI(xvid+mp3) 2pass
Command0=""<%AppPath%>\cores\ffmpeg2" -y -i "<%InputFile%>" -pass 1 -passlogfile "<%TemporaryFile%>" -timestamp "<%TimeStamp%>" -flags bitexact -vcodec libxvid -s 320x240 -r 30 -b 400k -acodec libmp3lame -ac 2 -ar 44100 -ab 256k -f avi "<%TemporaryFile%>.avi""
Command1=""<%AppPath%>\cores\ffmpeg2" -y -i "<%InputFile%>" -pass 2 -passlogfile "<%TemporaryFile%>" -timestamp "<%TimeStamp%>" -flags bitexact -vcodec libxvid -s 320x240 -r 30 -b 400k -acodec libmp3lame -ac 2 -ar 44100 -ab 256k -f avi "<%OutputFile%>.avi""
Command2="rm "<%TemporaryFile%>-0.log""
Command3="rm "<%TemporaryFile%>.avi""
- xvidコーデックを2passエンコードで使用すると、コーデックの仕様でWindowsのTempフォルダに「xvidff.n」(n=0,1,2,・・・)という
テキスト形式のログファイルが作成されます。対策は別ページ(動画を2パスエンコードする) を参照してください。
このログファイルは旧FFmpegでは変換君のルートパスに作成されますが、新FFmpegではTempフォルダに作成されるため、
削除する場合はbatファイルでTempフォルダをフルパス指定するか、batファイルをTemフォルダに設置して
iniでTempフォルダのパスを指定してください。
(例2) iPod 向け MP4(H.264+AAC) の1passエンコード (新FFmpeg→ffmpeg2) マルチスレッド対応
[Item0]
Title=新FFmpeg - MP4(H.264+AAC) 1pass crf23
Command0=""<%AppPath%>\cores\ffmpeg2" -y -i "<%InputFile%>" -threads 0 -s 320x240 -vcodec libx264 -crf 23.0 -level 30 -coder vlc -qmin 10 -acodec libfaac -ab 128k -ac 2 -ar 48000 -f mp4 "<%TemporaryFile%>.mp4""
Command1=""<%AppPath%>\cores\NicMP4Box" -add "<%TemporaryFile%>.mp4" -new "<%OutputFile%>.mp4""
Command2="rm "<%TemporaryFile%>.mp4""
- NicMP4BoxによるH.264のエンコードについては別ページ(iPod)を参照して下さい。
- -threads 0 で CPU コア数に応じてスレッド数を自動的に決定してマルチスレッド化
ただし、0 指定は -vcodec libx264 指定時のみ有効なので、他のコーデックを使うときは
"-threads 3" のように適当な数字 (CPUのコア数+α) を直接指定する
- H.264のオプションに関する詳しい情報は別ページ(コーデック)のH.264を参照してください。
(例3) WMV8 (wmv2+wmav2) の1passエンコード (新FFmpeg→ffmpeg2)
[Item0]
Title=WMV8 wmv2+wmav2
Command0=""<%AppPath%>\cores\ffmpeg2" -y -i "<%InputFile%>" -vcodec wmv2 -qscale 4 -re -s 320x180 -acodec wmav2 -ab 96k -ac 2 -ar 44100 -f asf "<%TemporaryFile%>.wmv""
Command1=""<%AppPath%>\cores\asfbin" -y -i "<%TemporaryFile%>.wmv" -sionly -y -o "<%OutputFile%>.wmv""
Command2="rm "<%TemporaryFile%>.wmv""
[Item0]
Title=WMA8 wmav2 音だけ
Command0=""<%AppPath%>\cores\ffmpeg2" -y -i "<%InputFile%>" -vn -re -acodec wmav2 -ab 96k -ac 2 -ar 44100 -f asf "<%TemporaryFile%>.wma""
Command1=""<%AppPath%>\cores\asfbin" -y -i "<%TemporaryFile%>.wma" -sionly -y -o "<%OutputFile%>.wma""
Command2="rm "<%TemporaryFile%>.wma""
- ffmpegを利用してasfをエンコードし、asfbinを利用してwmvコンテナに収納するiniです。近年ポータブルデバイスに導入されつつある
wmv、wmaフォーマットの動画をエンコードできます。
- asfbinはWindowsのSDK(開発キット)の機能を使わずにasfファイルを編集できるコマンドベースのソフトウェアです。
非営利目的の使用に限りフリーウェアとして利用できます。詳細はRadioactive Pageをご覧下さい。(日本語ページもあり、ただしソフトの更新が遅い)
ダウンロードはこちらから、「コマンドラインバージョン」を選択してください。
- wma9に比べて圧縮率は下がりますが、AviSynthとの併用により多彩な入力フォーマットを安定してデコードでき、
かつffmpegのオプションを利用したエンコードができる利点があります。
(例4) マトリョーシカ関連のエンコード (新FFmpeg→ffmpeg3)
[Item0]
Title=MKV libxvid+libvorbis
Command0=""<%AppPath%>\cores\ffmpeg3" -y -i "<%InputFile%>" -timestamp "<%TimeStamp%>" -vcodec libxvid -s 320x240 -r 30 -b 400k -acodec libvorbis -ac 2 -ar 441000 -ab 128k -f matroska "<%OutputFile%>.mkv""
[Item0]
Title=OGG 音だけ libvorbis(参考)
Command0=""<%AppPath%>\cores\ffmpeg3" -y -i "<%InputFile%>" -timestamp "<%TimeStamp%>" -vn -acodec libvorbis -ac 2 -ar 441000 -ab 128k -f ogg "<%OutputFile%>.ogg""
- マトリョーシカフォーマットの動画をエンコードするiniです。マトリョーシカは複数のファイルを格納できるフォーマットで、
動画用のMKVコンテナと音声のみのMKAコンテナが用意されています。(しかし動画の複数ファイル格納は未実装)
- マトリョーシカは様々なコーデックを格納できますが、ここでは映像xvid+音声Vorbisのものの設定を紹介します。
VorbisはOGGコンテナによく利用される音声コーデックで、OGG Vorbisが本来の名称です。OGG VorbisはOGGと混同しやすく、
OGGをコーデックと勘違いしがちなのはこのためです。
- rev11870の新FFmpegよりlibvorbisがエンコード可能になりました。しかしサンプリング周波数が1/10に誤ってコーディングされるようです。
そのためこの例では44100→441000としています。Vorbisの規格では8〜192kHzとなっているので、現在無理矢理再生する形です。
libx264 (H.264コーデック) を使用する際の注意点 †
FFmpegはマルチコーデック対応であるため、デフォルトの状態が必ずしも全てのコーデックにとって適切であるとは限りません。
要するに、例えば変換君でもかなりの人が使用していると思われるx264コーデックを使用してエンコードする際、ネイティブのx264エンコーダーのデフォルト値を自分で指定してやらなければ不適切なオプションがいくつも適用されることになり、
結果、画質・変換時間・ファイルサイズ効率においてかなりの損をすることになります。
これについてはFFmpegのソースコードからffpresetファイルを入手して"-fpre"オプションを使うのが理想ですが、追加すべきオプションが分かっていれば自分でiniファイルにオプションを加える方が手っ取り早い方法かも知れません。
以下、サンプルとしてx264の各プロファイルにおける差分デフォルト指定オプションを載せておきます。
コメント欄 †