名古屋出身ソフトウェアエンジニアのブログ

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.01.00.0
saturation0.03.01.0
contrast-1000.01000.01.0
gamma0.110.01.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

実際に埋め込んでみた例です。

SSX Tricky - Aloha Ice Jam 1'32.09

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 -