FFmpeg で個人的によく使うコマンドまとめ
公開:
更新:
目次
時間範囲で切り出し
ffmpeg -ss 00:01:45.200 -to 00:02:11.000 -i INPUT.mp4 -c copy OUTPUT.mp4
リサイズ
ffmpeg -i INPUT.mp4 -vf scale=1920:1080 -c:a copy -movflags faststart OUTPUT.mp4
-1
を指定した辺は、アスペクト比を維持して自動設定されます。
ffmpeg -i INPUT.mp4 -vf scale=1920:-1 -c:a copy -movflags faststart OUTPUT.mp4
リサイズフィルタの指定
ffmpeg -i INPUT.mp4 -vf scale=1920:-1:flags=lanczos -c:a copy -movflags faststart OUTPUT.mp4
画像の部分切り出し
パラメータは WIDTH:HEIGHT:OFFSET_X:OFFSET_Y
です。OFFSET_X
, OFFSET_Y
は切り出し範囲の左上座標です。
ffmpeg -i INPUT.mp4 -vf crop=1600:720:0:540 -c:a copy -movflags faststart OUTPUT.mp4
色補正
ffmpeg -i INPUT.MOV -vf "eq=brightness=0.05:saturation=1.5:contrast=2.5:gamma=0.9,colortemperature=temperature=6500" -c:a copy -movflags faststart OUTPUT.MOV
各フィルタの値範囲は以下の表の通りです。
下限 | 上限 | デフォルト | |
---|---|---|---|
brightness | -1.0 | 1.0 | 0.0 |
saturation | 0.0 | 3.0 | 1.0 |
contrast | -1000.0 | 1000.0 | 1.0 |
gamma | 0.1 | 10.0 | 1.0 |
アンシャープマスク
# 横窓サイズ:縦窓サイズ:強度
ffmpeg -i INPUT.mp4 -vf unsharp=3:3:1.5 -c:a copy -movflags faststart OUTPUT.mp4
フレーム補間
# 60 のところが出力フレームレート
ffmpeg -i INPUT.mp4 -vf "minterpolate=60:2:0:1:8:16:32:0:1:5" -c:a copy -movflags faststart OUTPUT.mp4
動画の結合
必ず再エンコードされる代わりに、異なるコーデックでも OK なコマンドです。
ffmpeg -i INPUT1.mkv -i INPUT2.mkv -i INPUT3.mkv -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] concat=n=3:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" -movflags faststart OUTPUT.mkv
動画の数が多いと記述が面倒なので、Python ワンライナーを用意しました。
python3 -c "import sys, subprocess; args=sys.argv[1:]; inputs=args[:-1]; n=len(inputs); input_files=[]; filter_complex=''; [(input_files.extend(['-i', file]), filter_complex:=filter_complex + f'[{i}:v] [{i}:a] ') for i, file in enumerate(inputs)]; cmd=['ffmpeg', *input_files, '-filter_complex', filter_complex + f' concat=n={n}:v=1:a=1 [v] [a]', '-map', '[v]', '-map', '[a]', '-movflags', 'faststart', args[-1]]; subprocess.run(cmd)" INPUT1.mkv INPUT2.mkv INPUT3.mkv OUTPUT.mkv
TS (Transport Stream) 動画の結合
ffmpeg -i INPUT.m3u8 -c copy -movflags faststart OUTPUT.mp4
このときの m3u8 ファイルは以下のようになっているべきです。
v1.ts
v2.ts
...
concat
プロトコルを使う場合
ffmpeg -i "concat:00.ts|01.ts|02.ts|03.ts|04.ts|05.ts|06.ts|07.ts|08.ts|09.ts" -c copy -movflags faststart OUTPUT.mp4
mp4 を concat
する場合、一旦 ts にしないと使えない場合があるので注意が必要です。
seq -w 0 10 | xargs -IXX ffmpeg -i XX.mp4 -c copy XX.ts
音声トラックの分離
ffmpeg -i INPUT.mp4 -vn -c:a copy OUTPUT.m4a
別の音声トラックで置換
ffmpeg -i INPUT.mp4 -i AIN.mp3 -map 0:v:0 -map 1:a:0 -c copy OUTPUT.mp4
連番静止画取得
mkdir imgs
ffmpeg -i INPUT.mp4 -f image2 imgs/%08d.png
連番静止画から動画化
ffmpeg -i AUDIO.wav -framerate 60 -i imgs/%08d.png -c:v libaom-av1 -vf format=yuv444p -g 120 -crf 25 -cpu-used 5 -c:a libopus -b:a 128k OUTPUT.mkv
VP9 へエンコード
Google のチュートリアルのままを掲載しています。ポータビリティを重視して Matroska コンテナを使います。
ffmpeg -i INPUT.mp4 -c:v libvpx-vp9 -c:a libopus OUTPUT.mkv
以下は HTML 埋め込み用にもう少し詰めるバージョン。
ffmpeg -i INPUT.mp4 -c:v libvpx-vp9 -b:v 1500K -frame-parallel 0 -tile-rows 0 -tile-columns 0 -c:a libopus -b:a 96k OUTPUT.webm
実際に埋め込んでみた例です。
H.265 へエンコード
正直 H.265 はほとんど使っていません。
ffmpeg -i INPUT.mp4 -c:a copy -c:v libx265 -preset slower -crf 18 -movflags faststart OUTPUT.mkv
AV1 へエンコード
アニメ想定のセッティングです。遅いです。
ffmpeg -i INPUT.avi -c:v libaom-av1 -frame-parallel 0 -tile-rows 0 -tile-columns 0 -g 120 -cpu-used 5 -crf 27 -c:a libopus -b:a 128k OUTPUT.mkv
スクリーンキャプチャ用 GIF をつくる
パレットを最適化して、綺麗な GIF をつくります。-r
はフレームレートを指定するオプションです。
ffmpeg -i INPUT.mp4 -r 10 -filter_complex "[0:v] split [a][b];[a] palettegen [p];[b][p] paletteuse" OUTPUT.gif
GIF, APNG などのアニメーション画像から動画ファイルを起こす
-pix_fmt yuv420p
等の画素形式指定が必要です。フレームレートオプション -r
では、再生速度を変えられない点に注意。
ffmpeg -i INPUT.png -pix_fmt yuv420p -movflags faststart OUTPUT.mp4
ストリームをテスト(破損チェック)
エラーがあれば、STDERR に出力されます。
ffmpeg -v error -i INPUT.mp4 -f null -