FFmpegで動画編集をするガイド
こんにちは。年末になり、ますますコマンドラインで動画編集をする機会が増えてきているかと思いますが、皆様いかがお過ごしでしょうか。普段触れていないとついつい忘れてしまうffmpegのオプション群。そんなあなたのためのチートシートです。
基礎編
トランスコーディング
ffmpeg -i input.mp4 -c:v libx264 -preset medium -c:a libfdk_aac output.mp4
または
ffmpeg -i input.mp4 -vcodec libx264 -preset medium -acodec libfdk_aac output.mp4
解説
-c:v
オプションは映像コーデックを、-c:a
は音声コーデックを指定する。古くはそれぞれ -vcodec
-acodec
というオプションであった。両者は等価である。
-preset
は libx264 の設定プリセット名を与える。
AAC エンコーダは ffmpeg ネイティブのものもあるが (aac
) 2015年12月現在、未だ実験的 (experimental) な扱いとなっているため、libfdk_aac
を代わりに使っている。なお、デコーダは experimental ではない。
(もしネイティブの aac
コーデックを利用する場合には -strict experimental
オプションが追加で必要となるので注意)
コンテナフォーマットの変更
ffmpeg -i input.flv -c:v copy -c:a copy output.mp4
または
ffmpeg -i input.flv -c:v copy -c:a copy -f mp4 output.mp4
解説
出力ファイルフォーマットは拡張子から自動的に決定される。-f
オプションにより明示することもできる。コーデック copy
を指定すると、入力ストリームはエンコード・デコードを経ずにそのまま出力に流される。
映像から音声を抜き出す
ffmpeg -i input.mp4 -c:a copy -vn output.mp4
または
ffmpeg -i input.mp4 -c:a copy -map 0:a output.mp4
解説
コンテナフォーマットに依存するが、基本的には動画ファイルは1つ以上の映像ストリームと音声ストリームから構成されている。何も指示がない場合、ffmpeg は入力のストリームの構成から自動的に出力のストリームの構成を決定する。入力ストリームと出力ストリームの対応を明示的に行うには -map
オプションを用いる。-map
オプションを指定した場合、対応づけが行われていないストリームは破棄される。
-map
オプションに指定できるのは次のような識別子である。
識別子 | 説明 |
---|---|
0:0 1:1 |
0番目の入力ファイルの0番目のストリーム 1番目の入力ファイルの1番目のストリーム |
0:v 1:a |
0番目の入力ファイルの全ての映像ストリーム (出現順) 1番目の入力ファイルの全ての音声ストリーム (出現順) |
[out] |
libavfilter (lavf)のストリーム名 (後述) |
動画に別録りした音声をつける
ffmpeg -i input.mp4 -i audio.mp3 -c:v copy -c:a aac -strict experimental -map 0:v -map 1:a output.mp4
解説
ffmpeg では -i
オプションを繰り返し指定することで、複数の入力ファイルを指定できる。最初の -i
オプションで指定したファイルは 0 番目のファイル、次の -i
オプションで指定したファイルは 1 番目のファイルとなる。
この例では、前述の -map
オプションを用いて、input.mp4
ファイルの動画ストリームと audio.mp3
の音声ストリームを合わせて output.mp4
として出力している。
動画のリサイズ
ffmpeg -i input.mp4 -s hd480 output.mp4
または
ffmpeg -i input.mp4 -s 852x400 output.mp4
または
ffmpeg -i input.mp4 -vf scale=hd480 output.mp4
または
ffmpeg -i input.mp4 -vf scale=852:400 output.mp4
解説
-s
オプションは出力される動画ストリームのフレームサイズを指定する。一方、-vf
オプションは動画ストリームに適用するフィルタを設定する。
明示的な指定がなくとも、常に暗黙にスケーリングフィルタが適用されるので、-s
オプションの指定で大体は十分ではあるが、スケーリングフィルタを明示的に指定することで、細かな設定が可能になる。
(実は上の例で-vf
オプションを指定した場合には明示的に指定されたフィルタの上に等倍のスケーリングフィルタが適用されることになり、二重にスケーリングフィルタが適用されることになるが、問題になることはない)
動画から連番のPNGファイルを生成
ffmpeg -i movie.mp4 -c:v png -f image2 output/%06d.png
解説
出力フォーマット image2
では %XXd のようなプレイスホルダーをファイル名に含めることで、フレーム番号をファイル名に含めることが可能である。
動画からアニメーションGIFを生成 (thanks to Yoshiori)
ffmpeg -i movie.mp4 -c:v gif -f gif -r 8 -s 320x180 output.gif
解説
出力フォーマット gif
を使うとアニメーションGIFを生成することができる。元動画のフレームレートが高い場合、出力ファイルサイズが肥大してしまうかもしれない。そのような場合は -r
オプションを指定することで、出力ファイルのフレームレートを指定して、調整を図る。
動画の特定の範囲を切り出す
ffmpeg -i movie.mp4 -ss 10 -t 20 -c:v copy -c:a copy output.mp4
解説
-ss
オプションを指定すると、続く引数に指定された秒数にシークして変換を開始する。-t
オプションは、続く引数に指定された秒数、変換を行う。
応用編
動画に画像を重ねる
ffmpeg -i movie.mp4 -i picture.png -filter_complex '[0:0] [1:0] overlay=x=0:y=0 [out]' -map '[out]' -map 0:a output.mp4
解説
overlayフィルタを利用すると、フィルタの0番目の入力を1番目の入力に重ねることができる。
この例では、最初の -i
オプションで指定された映像のストリーム ([0:0]
) をフィルタの0番目の入力に、次の -i
オプションで指定された映像のストリーム ([1:0]
) をフィルタの1番目の入力として、1番目の入力を0番目の入力のフレーム上の座標 (x, y) = (0, 0)
に重ねている。
指定したタイミングで映像に画像を重ねる
ffmpeg -i movie.mp4 -i picture.png -filter_complex '[0:0] [1:0] overlay=x=if(gt(t,5),if(lt(t,10),0,-10000),-10000),y=0 [out]' -map '[out]' -map 0:a output.mp4
解説
overlayフィルタのパラメータにはexpressionを使うことができる。この例では現フレームの時間であるt
という変数を使ってオーバーレイする座標を非連続に設定している。
5秒未満: x=-10000
10秒未満: x=0
10秒以上: x=-10000
重ねる対象を x=-10000
のように画面外に持ってくることによって特定のタイミングで重ね合わせを行うことを実現している。
まとめ
とくにまとめるような内容ではないのですが、よいお年をお迎えください。
Many thanks to pyspa community.
この記事はPyspa Advent Calendar 2015のエントリとして書かれました。次の記事はこちらです。