Twitterに投稿 はてなブックマークに追加 Yahoo!ブックマークに追加 Google Bookmarksに追加

目次 >> ffmpeg

ffmpegの使い方

ffmpegは、無料で使える動画および音声のエンコーダである。ここでは、ffmpegを使って、H.264、webm、wmvなどの各種動画に変換する方法を解説する。
ffmpegは、使い方はきわめて簡単である一方、様々なオプションを駆使すれば、より詳細な設定も可能である。

なお、DVDやBlu-rayのようにフォルダ構造をとるものの場合は、x264のバージョンは最新ではないものの、HandBrakeを使う方が簡単である。→HandBrakeの設定と使い方

最も基本的な使い方

まずは、もっと基本的な使い方。-iで入力ファイルを、すべてのオプションの最後に出力ファイルを設定するだけである。

ffmpeg -i 元動画ファイル [オプション類] 出力動画ファイル

ffmpegは入力元動画に関しては、ffmpegが解析し、適切なデコーダを、出力先動画に関しては、拡張子を元に適切なエンコーダが選ばれる。

ffmpeg -i exapmle.avi exapmle.mp4
ffmpeg -i exapmle.mov exapmle.flv
ffmpeg -i exapmle.wmv exapmle.mov
ffmpeg -i exapmle.mp4 exapmle.wmv
ffmpeg -i exapmle.mp4 exapmle.webm

このようにオプションを何もつけない場合、動画、音声ともデフォルトのパラメータが適用され、選択されるコーデックもffmpegのバージョンによって少しずつ変わってくる。
以下では、様々なオプションを駆使して、よりきれいな動画を、そして様々なプレーヤーで互換性の高いファイル作成することを目指す。

入力動画の情報を見る

エンコードを行わず、動画ファイルにどのようなコーデックが使われているかなどの情報を見たい場合は、

ffmpeg -i 動画ファイル

とすると、入力ファイルの情報を見ることができる(出力ファイルが指定されていない旨のエラーは表示される)

ffmpeg -i example.avi

の様に、出力ファイルを指定せずに、入力ファイルだけを指定する、。

動画ファイルから音声ファイルを作る

ffmpegは音声のみをエンコードすることもできる。

ffmpeg -i exapmle.avi exapmle.mp3

のように、入力ファイルに動画を出力ファイルに音声ファイルの拡張子(ここではmp3)を指定してやると、動画ファイルを音声ファイルに変換することができる。
ただし、この場合、再エンコードがかかるので、音質は劣化する。

音声ファイルを無劣化で作成する

上記のように、音声ファイルを指定しただけだと、再エンコードで音質は劣化する。-acodec copyのオプションを加えてやると、元のファイルから音声部分を抜き出したファイルが作成される。

ffmpeg -i exapmle.avi -acodec copy exapmle.mp3

とすると、音声部分が再エンコードせずに単純に抜き出されたファイルができる。
なお、ここでは、aviに含まれている、音声ファイルがmp3だと仮定している。実際に何が使われているかは、上記の「入力動画の情報を見る」を参考に調べると良い。

音声ファイルから音声ファイルを作る

ffmpegは動画を扱うプログラムだが、入力、出力とも音声ファイルを指定することもできる。

ffmpeg -i exapmle.wav exapmle.mp3

この例ではwavファイルをmp3に変換している。

ffmpegが扱えるものなら基本的に何でも可能である。

ffmpeg -i exapmle.mp3 exapmle.opus

この例ではmp3ファイルをopusフォーマットに変換している。

コンテナを変える

例えば、flv形式はiOSでは内蔵プレーヤでは再生できないが、mp4形式であれば再生できる。
もし、flv形式の動画が、mp4でもサポートしている、例えばH.264+ACCでエンコードされている場合、コンテナをflvからmp4に変えるだけで無劣化でiOSでも再生できるようになる。

コンテナを変換するには、動画、音声ともコーデックにcopyを指定してやれば良い。具体的には

ffmpeg -i example.flv -vcodec copy -acodec copy example.mp4

再エンコードをしないので、処理も高速である。

動画オプション

ビデオコーデックを指定する。-vcodec -c:v

ビデオコーデックは、-c:vもしくは-vcodecで指定する。

コーデックを指定しない場合、ffmpegでは、拡張子に応じて、自動的にコーデックが選ばれる。
ただし、自動的に選ばれるコーデックは、ffmpegのバージョンによって違い、例えば、mp4の拡張子でも、H.264が選ばれる場合と、H.263が選ばれる場合があったりする。H.264を使用したい場合は、明示的に、

ffmpeg -i exapmle.avi -vcodec libx264 exapmle.mp4

オプションをつけてやる必要がある。
2014年5月時点で、webmの拡張子ではVP8が使用されるが、このときVP9を使用したい場合などに、-vcodecオプションを使って明示的にビデオコーデックを指定する。

ffmpeg -i exapmle.avi -vcodec vp9 exapmle.webm

とすると、VP9が使用される。

動画コンテナおよびコーデックの選び方

2014年現在、主流はコンテナはmp4、圧縮コーデックはH.264である。現状では最も互換性の高い形式で、現在の主なOSで再生可能である。ffmpegでもmp4を出力動画の拡張子に指定した場合、デフォルトのコーデックとしてH.264が選択される。

次世代コーデックとしては、H.265があり、H.264の半分のファイルサイズで同等の画質が実現できるとされるが、エンコーダー、デコーダーとも発展途上である。下記の通り使えるオプションもまだ少ない。

webm形式はGoogleが主導するコンテナである。デフォルトで再生できない場合でも、フリーのソフトを導入するなどして、多くのOSで再生可能である。動画コーデックとしては、VP8およびVP9、音声コーデックとしてはVorbisおよびOpusが利用可能である。VP9およびOpusが最新のコーデックである。特にVP9はH.265に匹敵する画質を持つものとされる。

flvはかつて動画サイトで最も一般的なフォーマットで、現在でも多くの動画サイトで使われているが、標準で再生をサポートしているOSはなく、すでに旧式に属するので、特別な事情がない限り選択する理由はない。最新のf4vもあるが、こちらは、ほとんど普及していない。

古くからWindowsで使用されてきたAVIは無圧縮形式を除き、現在では原則避けるべきである。理由は、ほかのOS上での互換性の問題もあるが、そのほかにAVIは様々なコーデックを選択できるため、逆にAVIファイルというだけでは、コーデックの推定はできない。また、ファイルサイズの制限もある。
無圧縮形式の用途は、Matlabなどで、圧縮する前の一時的なビデオを作成する場合に使用される。

Macでは、QuickTimeのmov形式が長らく使用されてきた。WindowsのAVI形式が、再生できないときに、コーデックを探し回る必要があったのに対し、movファイルはQuickTimeプレーヤーでほぼ問題なく再生できるのは利点であった。Windows版のQuickTimeプレーヤーもあり、コーデックにH.264を使うこともできる。もっとも、現在のOSX、iOSは、H.264でエンコードした、mp4ファイルも再生できるので、mov形式を積極的に使う理由はあまりない。

ビットレート固定モードと品質固定モード

ビットレート固定モード

旧来、動画エンコードではビットレートを指定してエンコードするのが普通であった。
これの利点は、作成されるファイルサイズがあらかじめわかるという点である。
ただし動画の品質については、動画の内容やサイズによって変わってくるので、ビットレートをいくつか変えてみて満足する値を探す必要がある。

品質固定モード

一方、品質固定モードは、H.264などでのデフォルトのエンコードモードである。
なおこのモードは、比較的新しく、このモードをサポートしていないコーデックもあるので注意が必要である。
この利点は、動画の縦横サイズや内容にかかわらず、あらかじめ指定した品質の動画が作成できる点である。
ただし、ファイルサイズは予測できない。動きの少ないものであれば、ファイルサイズは小さくなるし、サイズが大きくて動きの激しいものは一般的にファイルサイズが大きくなる。

最大ビットレート指定の品質固定モード

このモードは、二つのモードを混ぜたようなモードである。
原則、指定された品質を保つようにエンコードするが、ビットレートは、指定されたビットレートを超えないようにエンコードされる(すなわちその部分は品質が落ちる)。
ただし、最大ビットレートをあまりに低く指定すると、常にそのビットレートでエンコードするようになってしまい、ビットレート固定モードと変わらなくなってしまうので注意が必要である。

動画のビットレートを指定する -b:v

ビットレート固定モードではこの値を指定する。-b:vオプションで指定。何もつけない場合はバイト/秒。kやMなどをつけるとkbpsやMbpsになる。
以下は300kbpsに指定した例。3例とも同じ意味である。
ffmpeg -i exapmle.avi -b:v 300000 exapmle.mp4
ffmpeg -i exapmle.avi -b:v 300k exapmle.mp4
ffmpeg -i exapmle.avi -b:v 0.3M exapmle.mp4
ビットレートは大きいほどきれいな動画が出来上がる。最新のコーデックを使うほど基本的に小さいビットレートで古いコーデックの大きなビットレートと同等の画質が得られるようになる。また、画像サイズが大きい動画ほど、ビットレートを大きくする必要がある。最終的には、適切なビットレートは何度か試してみて目で見て確認してみるしかない。なお単位のkは1000であり1024ではない。

2パスエンコード

ビットレート固定モードの場合、時間に余裕がない場合を除き、2パスエンコードを行うのが望ましい。
1パス目で動画を解析し、2パス目で解析結果を基に最適な動画を作成する。
なお、品質固定モードの場合は2パスエンコードは意味がないので注意。
やり方は、

ffmpeg -i example.avi -b:v 300k -pass 1 example.mp4
ffmpeg -i example.avi -b:v 300k -pass 2 example.mp4

と、-passを1、2と変えてエンコードする。2パスエンコードの場合、ビットレートを必ず明示的に指定する必要がある。
-passlogfileで、ログファイルを指定することもできる。

品質固定モードでの動画品質の指定 -crf

-crf値で動画の品質を指定する。
小さい値ほど品質は良くなる。
コーデックにより、とれる値の範囲、デフォルト値は違い、また同じ数値でもコーデックにより結果が変わってくる。

ffmpeg -i exapmle.avi -crf 10 exapmle.mp4

フレームレートの指定 -r

-rの後にfpsで指定。何も指定しないと、元ファイルと同じfpsが使われる。
下記の例は10fpsに指定して変換。

ffmpeg -i exapmle.avi -r 10 exapmle.mp4

サイズを指定する -s

-sオプションの後ろに、横x縦をピクセルで指定して設定する。
ffmpeg -i exapmle.avi -s 1920x1080 exapmle.mp4
画像は-sオプションで指定したとおりに、ストレッチされるため、縦横比はそれに応じて変化する。
縦横比を保ちたい場合は自力で計算して求める。

最大ファイルサイズを指定する

最大ファイルサイズを指定するには-fsオプションをつける。サイズはバイトで指定。
最大ファイルサイズであるので、ビットレートが低いなどエンコード条件によっては、それ以下のサイズになる。

ffmpeg -i exapmle.avi -fs 100000 exapmle.mp4

H.264でエンコードする

H.264でエンコードする場合、2つのモードがある。品質固定モードと、ビットレート固定モードである。
これらは排他的であり、なにもオプションを指定しないと、品質固定モードでエンコードされる。

品質固定モード

品質は-crfで指定する。
とれる範囲は0から51。値が小さいほど、高画質になるが、その分ファイルサイズは増える。
デフォルト値は23。
このモードは基本的に1パスのみである。

crf値の選択

ビットレートは、crf値が6減るごとに、およそ倍になる。
18以下でほぼ見た目上の劣化がなくなる。0でロスレスとなるが、ロスレスエンコードには、-cfr 0よりも-qp 0が推奨されている。なおロスレスエンコードを行うと、ffmpegベースのプレーヤー以外では再生できないプレーヤーもあるので注意。
通常使われる範囲としては18から28の間が推奨されるが、アーカイブが目的であれば、18よりも小さい値を、モバイル機器で一時的に見るだけであれば、28より大きい値を指定するのもありである。

ビットレート一定モード

-b:vでビットレートを指定すると、品質一定モードからビットレート一定のモードに変わる。
1パスと2パスモードでエンコードできる。当然のことながら2パスの方が同じビットレートでも画質は上がる。保存用であればフルHDで25Mbps、4kで100Mbps程度はほしい。

プリセット

-presetオプションはエンコード速度と品質もしくは出来上がるファイルサイズを決定する。

-preset [ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo]

デフォルトはmedium。

品質固定モードの場合、出来上がる品質は同じであるが、速度が速くなるほど、ファイルサイズは大きくなる。
時間がある限り-preset praceboを使うとより小さいファイルにすることができる。

ビットレート一定の場合は、同じファイルサイズでも、時間をかけた分、品質が向上する。

tune

プリセットで指定した後、さらにtuneで詳細な指定が行ない、動画を最適化できる。
通常使うオプションは、

-tune [film, animation, grain, stillimage, fastdecode, zerolatency]

で、デフォルト値では無指定である。

filmは実写の動画向きに最適化される。
animationはアニメ向けに最適化される。
grainはざらざらが残るような古い映画などをエンコードする際に使われる。
stillimageは、スライドショーなど、動きのほとんどない場合に使う。

fastdecodeはCABACおよびin-loop deblockingを無効にし、デコードの際の負荷を減らす。その分画質は落ちる。モバイル機器など、貧弱な環境向けにエンコードしたい場合に使う。

zerolatencyは再生の際のレイテンシーを減らしたい場合に使う。頭出しは速くなるが、ファイルサイズは少し増加する。

複数のオプション、例えばfastdecodeとzerolatencyを両方指定したい場合は、カンマで区切って指定する。

-tune fastdecode,zerolatency

H.264で互換性を高める

いくつかの古いプレーヤーは、YUV 4:2:0でエンコードされたファイルの再生しかサポートしていない。
YUV 4:2:0でエンコードするには、

-pix_fmt yuv420p

もしくは

-vf format=yuv420p

オプションを付加する。

ダウンロードしながらの再生に対応する

動画のインデックス情報はmoov atomに格納されているが、これは通常、ファイルの最後に付加されている。

エンコードする際に、

-movflags +faststart

というオプションをつけると、moov atomがファイルの最初につくようになり、動画ファイルを完全にダウンロードしなくても再生を始めることができるようになる。

なお、動画サイトではサイト側で自動的に付加される。

VP9でエンコードする

VP9のコーデックを指定する

現状では、ffmpegで出力ファイルに.webmを指定すると、VP8(ビットレートは200k)が使われる。

VP9でエンコードするには、

-vcodec vp9
もしくは
-vcodec libvpx-vp9

を指定する。

ビットレート一定のモード

VP9では、何もオプションを指定しない場合ビットレート固定モードとなる。
オプションを指定しない場合のデフォルトのビットレートは200k(ただし200kであまりに小さすぎてエンコードできないようなものは、これより大きな値になるようである)であり、これは、最近のビデオサイズであると、かなり低い。
DVDサイズでも、500k前後、できれば1M以上はほしいところである。保存用であれば、フルHDで20Mbps、4kで60Mbpsはほしい。
なお、ビットレートを非常に高く指定しても、それ以下で最高品質である-crf 0が実現してしまう場合、それが実現するビットレートでエンコードされる。すなわち非常に高いビットレートを指定しても指定したビットレートに達しない場合がある。

ほかのコーデック同様、1パス、および2パスエンコードが使用可能で2パスエンコードが望ましい。

品質一定モード

-crfオプションで決まる。値は0から63。
小さい数字ほど品質は上がる。

VP9で品質固定モードでエンコードする場合、下記の理由によりビットレートは必ず指定すること。

VP9では、-b:vで指定されたビットレートを上限に、crfで指定された品質を実現しようとする。
ビットレートを指定せずに、-crfしかし指定しないとデフォルトのビットレート200kbpsが上限に適用されてしまうので、実質望みのcrfを実現できない。
完全にcrfに従うようにするには、ビットレートを極端に高い値にする。例えば、-crf 10 -b:v 1000Mbpsなどとすると、当然1000Mなどというビットレートには達しないので、crf値に従ってビットレートは決まる。

マルチプロセッサを使う(VP9では未サポート)

-threadsで使用するプロセッサの数を指定する。

-threads 8

とすると、8つ使用する。

今のところVP8だけで有効のようである。

H.265でエンコードする

H.265は現在主流のH.264の後継であり、今後主流となると推定される。H.264の半分のビットレートで同等の画質を実現できると言われている。
まだ再生できる環境は少ないが、ffmpegでも最近サポートされた。
ffmpegでエンコードするにはコーデックとして、hevcを指定する。

-vcodec hevc

デフォルトでは、200kbpsの固定ビットレートモードになる。

H.264同様、

-preset [ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo]

および

-tune

は使用可能であるが、まだ未完成な部分があり、-crfを指定した品質固定モードや、2パスエンコードは未サポートである。
動画の品質は、ビットレートを変えて指定する。

wmvでエンコードする(PowerPoint用動画)

wmvはWindowsおよびMacのPowerPointで再生できる動画のうち、最も互換性の高いフォーマットである。
PowerPointでプレゼンテーションを行う場合、wmv形式にして埋め込むと、再生できないといった不具合と最小限にすることができる。
なお、Macの場合、Flip4Macをあらかじめインストールしておく必要がある。

-vcodec にはwmv2が最も効率が良いようである。それでも比較的古いコーデックなので、同じ画質を実現するには、ビットレートは最新のコーデックと比較して、かなり大きくする必要がある。

1パス目
ffmpeg -i exapmle.mp4 -b 3000k -vcodec wmv2 -pass 1 -an exapmle.wmv
2パス目
ffmpeg -i exapmle.mp4 -b 3000k -vcodec wmv2 -pass 2 exapmle.wmv

複数の静止画からの動画作成

連続した複数のJPEGファイルやPNGファイルなどを作成するには、入力ファイルを指定する-iオプションの後に、静止画ファイルを指定すれば良い。具体的には、pic00001.png、pic00002.png、pic00003.png、pic00004.png、pic00005.png、のようなPNGファイルから動画を作成するには、

ffmpeg -i pic%05d.png movie.mp4

となる。%05というのは、Cなどにおける指定方法と同じである。
なおWindowsの場合は、

ffmpeg -i pic%%05d.png movie.mp4

のように、%を%%のように二重にしてやる必要がある。

静止画は、読み込めさえすればwebpなど最新の規格も使うことができる。


音声オプション

音声コーデックの指定 -acodecもしくは-codec:a

音声コーデックは-acodecもしくは-codec:aで指定する。

音声が不要な場合は-anをつける。元々入っていない場合は作成されないので、不要。2パスエンコードの1パス目でつけると音声変換の時間分だけ短縮できる。
逆に音声だけ取り出す場合は、拡張子をmp3などにする。

opusでエンコードする

-acodec libopus

orbisでエンコードする

-acodec libvorbis

AACでエンコードする

-acodec libfdk_aac

mp3でエンコードする

-acodec libmp3lame

再エンコードを行わない

-acodec copyを指定すると、単純に抜き出される再エンコードが行われないので無劣化である。

-acodec copy

音声コーデックの選び方

すでに圧縮された動画、音声とも再圧縮は極力避けるべきである。特に音声の場合、動画と比較してしめる容量も大きくないので、もしコンテナが元の音声形式をサポートしているなら、そのまま-acodec copyでコピーするのが良い。

ffmpegの公式ホームページのドキュメントによると、音質的には

libopus >= libvorbis >= libfdk_aac > libmp3lame > libfaac >= eac3/ac3 > aac > libtwolame > vorbis > mp2 > wmav2/wmav1 > libvo_aacenc

の順であるとのことである。このうち実際に使うのは、
コンテナがmp4、flvである場合は、mp3かaac、
webmである場合は、opusかvorbisであるので、

libopus >= libvorbis >= libfdk_aac > libmp3lame

であるので、まとめると

mp4もしくはflvなら

-acodec libfdk_aac
-acodec libmp3lame (AACが何らかの理由で使えない場合)

webmもしくはmkvなら

-acodec libopus
-acodec libvorbis (opusが利用できない理由がある場合)

ffmpegドキュメントによる許容範囲内といえる最小ビットレートは、opusが80kbps、vorbisが96kpbs、mp3が128kbpsである。
推奨ビットレートは、opus、vorbis、aacが128kbps以上、mp3が192kbps以上である。
ffmpegのデフォルトビットレートはこれより低いので注意が必要である。

ビットレートを指定する

-ab bitrate音声のビットレート。

サンプリング周波数を指定する

-ar freq音声のサンプリング周波数。デフォルトはソースと同じ。

チャンネル数を指定する

-ac channels チャンネル数。ステレオなら2、モノラルなら1。通常はソースによって自動的に決まる。

mp3でエンコードする

コーデックには

-acodec libmp3lame

を指定する。

最高品質(320kbpsの固定ビットレート)

-b:a 320k

可変ビットレート -q:a

-q:aで指定。数値は0から9。小さい値ほど高音質。LAMEの-V 0から-V 9に相当する。

固定ビットレート -b:a

-b:aで指定。とれる値は、
8k, 16k, 24k, 32k, 40k, 48k, 64k, 80k, 96k, 112k, 128k, 160k, 192k, 224k, 256k, 320k

許容範囲内といえる最小ビットレートは、128kbps、推奨ビットレートは192kbps以上である。

AACでエンコードする

コーデックには

-acodec libfdk_aac

を指定する。

固定ビットレートでエンコードする

何もオプションを指定しないと、固定ビットレートモードになる。ビットレートはエンコーダによって自動的に算出される。
固定ビットレートでビットレートを指定するには-b:aで指定する。

-b:a 128k

この場合、128kbpsに指定している。

推奨ビットレートは、128kbps以上。

可変ビットレートでエンコードする

-vbrオプションを付加すると、可変ビットレートになる。数値は1から5で大きいほど高音質になるがファイルサイズは大きくなる。
1 : チャンネルあたりおよそ32kbps
2 : チャンネルあたりおよそ40kbps
3 : チャンネルあたりおよそ48-56kbps
4 : チャンネルあたりおよそ64kbps
5 : チャンネルあたりおよそ80-96kbps

Windows用バイナリの注意点

配布されているWindows用バイナリはライセンスの関係上libfdk_aacもlibfaac入っていない。自力でコンパイルするかもしくは、コーデックに音質の少し落ちるaac指定する必要がある。さもないと、音質の非常に悪い、libvo_aacencが使われてしまう。
なお、aacを指定した場合、 -strict -2も同時に指定する必要がある。

-acodec acc -strict -2

Opusでエンコードする

コーデックには

-acodec libopus

を指定する。

ビットレートを指定する

可変ビットレート、固定ビットレートとも、ビットレートを指定するには-b:aで指定する。

-b:a 128k

この場合、128kbpsに指定している。

許容範囲内といえる最小ビットレートは80kbps、推奨ビットレートは128kbps以上である。

固定ビットレートと可変ビットレートモード

Opusでは、デフォルトは可変ビットレートである。固定ビットレートにするには

-vbr off

とする。

-vbr on

とすると可変ビットレートになるが、デフォルトでこのようになっているのでわざわざ指定する必要はない。

会話向けに最適化する

-application voip

オプションをつけると、会話向けに最適化される。
デフォルトでは

-application audio

音楽向けとなっている。
このほかに

-application lowdelay

という遅延を少なくするオプションもある。

その他の事項

特定の部分だけ切り出す

-ssで開始時間の場所を指定する。
-tでssで指定した時間からここで指定した時間分切り出す(終了時間の指定ではないので注意)。
単位は共に何もつけない場合は秒。hh:mm:ssでの指定も可能。hh:mm:ss.xxxでコンマ秒単位で指定できる。

音声ファイルに静止画をつける

-loop 1を静止画ファイルの前につけて、ソースに静止画ファイルと音声ファイルを指定し、-shortestを指定する。
下記の場合、動画のコーデックにH.264を指定し(-c:v libx264)、静止画に最適化(-tune stillimage)している。

音声ファイルを再エンコードせずに組み込むには

ffmpeg -loop 1 -i example.jpg -i example.mp3 -c:v libx264 -tune stillimage -c:a copy -shortest example.mp4

音声ファイルをmp3にエンコードして組み込むには

ffmpeg -loop 1 -i example.png -i example.wav -c:v libx264 -tune stillimage -c:a libmp3lame -shortest example.mp4

動画から静止画を取り出す

-f image2を指定して、-vf fps=fps=で取り出す間隔をしてする。

動画から1秒ごとの静止画をpng画像として取り出すには、

ffmpeg -i example.mp4 -f image2 -vf fps=fps=1 example%05d.png

動画から10秒ごとの静止画をjpg画像として取り出すには、

ffmpeg -i example.mp4 -f image2 -vf fps=fps=0.1 example%05d.jpg

のようになる。

動画をクリッピングしてエンコードする

画面の特定部分のみをエンコードするには

ffmpeg -i input.mp4 -filter:v "crop=幅:高さ:開始上:開始左" output.mp4

のようにcropフィルターを使う。最初の2つが切り出した際の動画の幅と高さで、次の2つが切り出す際の開始点である。

例えば

ffmpeg -i input.mp4 -filter:v "crop=640:480:100:200" -c:a copy output.mp4

とすれば、上から100ピクセル目、左から200ピクセル目を起点として、縦480ピクセル、横640ピクセルの動画を作成する。

in_w、in_hも使うことができ、

ffmpeg -i input.mp4 -filter:v "crop=in_w/2:in_h/2:in_w/2:in_h/2" -c:a copy output.mp4

とすると、画像の中心を起点として、縦横半分を切り出す。すなわち、右下4分の1の画像が切り出される。

動画を回転させてエンコードする

transposeオプションを使う。

ffmpeg -i input.mp4 -vf "transpose=1" output.mp4

0:90度反時計回りに回転したのち上下反転
1:90度時計回り
2:90度反時計回り
3:90度時計回りののち上下反転

width not divisible by 2 エラーが出る場合は?

縦、横のピクセル数が2の倍数でない場合、このようなエラーが出る場合がある。その際は、

-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"

としてやると、2の倍数になるように調整してくれる。

AWSのAmazon Linux AMIでのコンパイル方法

Amazon Linux AMIでは、ffmpegをyumでインストールできない。
しかし、公式ページの案内、https://trac.ffmpeg.org/wiki/CompilationGuide/Centosに従ってインストールしていけば、容易にインストールできる。

まず、いくつかの必要なものをインストールする。

$sudo yum install autoconf automake cmake freetype-devel gcc gcc-c++ git libtool make mercurial nasm pkgconfig zlib-devel

あとは、上記ページにある通りに進めていけばよいのであるが、上記のページ内の全コマンドをスクリプトにしておいたので、このスクリプトを実行すればffmpegのインストールまで自動で完了する。

Windowsでのコンパイル方法

ここでは、Visual Studio Community 2013を使って、ffmpegをソースコードからコンパイルする方法を解説する。OSはWindows 7 64 bit版。

Visual Studio Community 2013の設定

Visual C++をコマンドラインから利用できるようにしておく。一番簡単な設定方法は、
まず、Windowsのスタートメニューから、[Visual Studio 2013][Visual Studio Tools][VS2013 x64 Native Tools Command Prompt」を起動する。
そして

$ env

と打つと、環境変数が多数表示されるはずである。その中の

INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\INCLUDE;C:\Program Files (x86)\Windows Kits\8.1\include\shared;C:\Program Files (x86)\Windows Kits\8.1\include\um;C:\Program Files (x86)\Windows Kits\8.1\include\winrt;



LIB=C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\LIB\amd64;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\LIB\amd64;C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64;

という行を見つけ出し、環境変数INCLUDEに
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\INCLUDE;C:\Program Files (x86)\Windows Kits\8.1\include\shared;C:\Program Files (x86)\Windows Kits\8.1\include\um;C:\Program Files (x86)\Windows Kits\8.1\include\winrt;

を、環境変数LIBに

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\LIB\amd64;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\LIB\amd64;C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64;

を設定する。これらの値は、各パソコンごとに違う可能性があるので、envコマンドで打ち出して、コピーするのが良い。

環境変数、

MSYSのインストール

まず、MinGWのMSYSをインストール

ここから、インストーラをダウンロードする。

mingw-get-setup.exeを実行して、インストーラを起動。

mingw-developer-toolkit、mingw32-base、mingw32-gcc-g++、msys-base、msys系のすべての項目(binとある項目だけで良い、またmsys-gccがあるとopusがコンパイルできないので、除いておく)、にチェックを入れて、[Installation]-[Apply changes]を選択して、MSYSをインストールする。
なお、後述のfdk-aacを入れずに素のffmpegをコンパイルするだけなら、msys-baseだけでもOKである。
そして

C:\MinGW\msys\1.0\bin

および

C:\MinGW\bin

にパスを通しておく。なお、C:\MinGW\msys\1.0\binは、Windowsパスよりも前に来るようにしないと、lameコンパイル時にエラーが出る。

YASMのインストール

次にYASMをインストールする。
ここから、自分のシステムに合ったものをダウンロードする。
今回の環境は、Windows 7 64 bitなので、「Win64 .exe (for general use on 64-bit Windows)」とある、yasm-1.3.0-win64.exeをダウンロードした。

ダウンロードしたファイルは、圧縮されたものなどではなく、実行ファイルそのものである。
ファイル名をyasm.exeと変えて、適当な例えばC:\Win32app\yasmなどのフォルダを作成し、そこにyasm.exeをコピーして、パスを通す。(すでにパスの通っているフォルダに置いてもよい)

コンパイル

まず、ffmpegのソースコードをダウンロードして、解凍しておく。

解凍したフォルダ(例えば\ffmpeg-2.7)で、コマンドプロンプトを起動し、

sh

と打つと、mingwに入れる(>という表示から$という表示に変わるはずである)。

./configure

と打つ。
もしMS Visual C++を持っているのなら、

./configure --toolchain=msvc

とするとMS Visual C++を使ってくれる。
もしインテルコンパイラを持っているのなら、

./configure --toolchain=icl

とするとインテルコンパイラを使ってくれる。

makeする前に、リンカーがVC++のものを指しているかどうか確かめる。

$ which link
/c/Program Files (x86)/Microsoft Visual Studio 12.0/VC/bin/amd64/link.exe

もしこのとき、/bin/link.exeや/usr/bin/link.exeを指していたら、C:\MinGW\msys\1.0\bin\link.exeの名前を変えるか、パスの通っていない別の場所に移動しておく。なお、MinGWにおける、/usrに対応するWindowsフォルダはC:\MinGW\msys\1.0である。

次に、

$make

で、コンパイル作業が始まる。それなりに時間がかかる。
なお、並列コンパイルオプション -jをつけてmake -jとすると、うまくいかない場合があるようである。
完了すると、同じフォルダにffmpeg.exe他ができているはずである。

fdk-aacを有効にしてコンパイルする

ここから本題。fdk-aacは再配布できないライセンスなので、本家のホームページからたどっていける、Windowsバイナリには含まれていない。

まず、ここから、ソースコード(例:fdk-aac-0.1.4.tar.gz)をダウンロードする。
そのファイルを解凍し、そのフォルダ(例:fdk-aac-0.1.4)からコマンドプロンプトを起動する。

sh
と打って

$autoreconf -fiv (不要?)
$./configure --prefix=/usr/local/hogehoge --disable-shared
$make
$make install

すると、C:\MinGW\msys\1.0\local\hogehoge以下のincludeとlibにコンパイルに必要なファイルがそろっているはずである。

次に、解凍したffmpegのソースファイルのフォルダでから、コマンドプロンプトを起動し、

sh

と打つ。そして、

./configure --extra-cflags="-I/usr/local/hogehoge/include" --extra-ldflags="-L/usr/local/hogehoge/lib" --enable-libfdk-aac --enable-gpl --enable-nonfree

(--toolchain=msvcの方でやってみたが、エラーが出てうまくいかなかったのでmingwオンリーでコンパイル)

この後、

$make

と打てば、しばらくの後、同じフォルダ内に、ffmpeg他ができているはずである。

その他も、入れてコンパイルする

上記のコンパイルでは、fdk-aacを有効にすることのみに的を絞った。ただし上記のオプションではfdk-aacは使えるものの、他のオプション例えばx264でさえ使えない。
acc
に加えて、
x264
webm
mp3
opus
も有効な状態でコンパイルしてみる。

mp3をコンパイル

ここから最新のソースコード(例:lame-3.99.5.tar.gz)をダウンロードする。

解凍したフォルダ(例:lame-3.99.5)からコマンドプロンプトを起動して

>sh
$./configure --prefix=/usr/local/hogehoge --enable-nasm --disable-shared
$make
$make install

libx264をコンパイル

ここから最新のソースコードをダウンロードする。

解凍したフォルダからコマンドプロンプトを起動して

>sh
$./configure --prefix=/usr/local/hogehoge --enable-static
$make
$make install

webm(VP8/VP9)をコンパイル

ここから最新のソースコード(例:libvpx-v1.3.0.tar.bz2)をダウンロードする。

解凍したフォルダ(例:libvpx-v1.3.0)からコマンドプロンプトを起動して

>sh
$./configure --prefix=/usr/local/hogehoge --disable-examples

このままでコンパイルするとエラーが出て進まないので、

configureの結果できた同じフォルダにあるlibs-x86-win32-gcc.mkファイル内の

HAVE_GNU_STRIP=yes

行を探し

HAVE_GNU_STRIP=no

に変える
そして、

$make

ここで最後にエラーが出るが、そのまま

$make install

と打てばOK。

opusをコンパイル

ここから最新のソースコード(例:opus-1.1.tar.gz)をダウンロードする。

コンパイルには、MinGWのgccを使う。MSYSのgccが入っていると、エラーでコンパイルできない。コンパイルエラーが起きたときは、mingw-get.exeを起動して、msys-gccにチェックが入っていないことを確かめる。

解凍したフォルダからコマンドプロンプトを起動して

>sh
$./configure --prefix=/usr/local/hogehoge --disable-shared
$make
$make install

このままだと、ffmpegで./configure --enable-libopusと打ったときに

ここからpkg-configをダウンロードし、pkg-config.exeをC:\MinGW\binに入れておく。
そして、
環境変数PKG_CONFIG_PATHを
export PKG_CONFIG_PATH=/usr/local/hogehoge/lib/pkgconfig
をと打って設定

ffmpegのコンパイル

次に、解凍したffmpegのソースファイルのフォルダでから、コマンドプロンプトを起動し、

sh

と打つ。そして、

もしここで、opusを組み込むのであれば

環境変数PKG_CONFIG_PATHを

$export PKG_CONFIG_PATH=/usr/local/hogehoge/lib/pkgconfig

をと打って設定するのを忘れずに。

$./configure --extra-cflags="-I/usr/local/hogehoge/include" --extra-ldflags="-L/usr/local/hogehoge/lib" --enable-libfdk-aac --enable-gpl --enable-nonfree --disable-shared --enable-static --enable-libx264 --enable-libmp3lame --enable-libvpx --enable-libopus

この後、

$make

と打てば、しばらくの後、同じフォルダ内に、ffmpeg他ができているはずである。

コマンドプロンプトで下記のように出れば成功である。

>ffmpeg
ffmpeg version 2.4 Copyright (c) 2000-2014 the FFmpeg developers
  built on Sep 15 2014 15:22:51 with gcc 4.8.1 (GCC)
  configuration: --extra-cflags=-I/usr/local/hogehoge/include --extra-ldflags=-L
/usr/local/hogehoge/lib --enable-libfdk-aac --enable-gpl --enable-nonfree --disa
ble-shared --enable-static --enable-libx264 --enable-libmp3lame --enable-libvpx
--enable-libopus
  libavutil      54.  7.100 / 54.  7.100
  libavcodec     56.  1.100 / 56.  1.100
  libavformat    56.  4.101 / 56.  4.101
  libavdevice    56.  0.100 / 56.  0.100
  libavfilter     5.  1.100 /  5.  1.100
  libswscale      3.  0.100 /  3.  0.100
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  0.100 / 53.  0.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfi
le}...

Use -h to get full help or, even better, run 'man ffmpeg'

最終更新日


本文中のFC4はFedora ProjectのFedora Core 4を、FC5はFedora Core 5を、FC6はFedora Core 6をopenSUSEはNovellのSUSE Linux OSSを表します。Fedora7以降は、単にFedora7、Fedora8、Fedora9、Fedora10、Fedora11、Fedora12、Fedora13、Fedora14、Fedora15と表示しています。Ubuntuは、必要に応じて13.04、14.04のようにバージョン番号をつけて区別しています。MandrivaはMandriva Linuxを表します。

ここに登場するドメイン名やIPアドレスなどはフィクションです。実在の人物・団体等とは一切関係がありません。
実際に使用する際は、各自の環境に合わせて書き換えてください。
もし何か間違いなどありましたらこちらからご連絡ください
リンクに許可は不要です。
Copyright (C) 2014 Chikuma Engineering Co., Ltd. All Rights Reserved.