FFmpeg は「なんとなく知っている」から「使えるようになる」までの壁が少し高い。コマンドの書き方は独特だし、オプションの数は膨大だし、エラーメッセージは英語だ。
でも実は、よく使うコマンドはそんなに多くない。この記事では実務でよく出てくる操作に絞って、実際にコピーして使えるコマンドを解説する。
この記事でわかること
- FFmpeg コマンドの基本構造
- 動画フォーマットの変換方法
- 音声の抽出・変換
- 動画の圧縮とクオリティ設定
- 動画の結合・分割・カット
- 解像度・フレームレートの変更
- 字幕の追加
- 画像から動画を作る方法
FFmpeg コマンドの基本構造
まず、FFmpeg コマンドの構造を理解しよう。すべてのコマンドはこのパターンに従っている。
ffmpeg [入力オプション] -i 入力ファイル [出力オプション] 出力ファイル
重要なのはオプションの位置だ。-i の前に書いたオプションは入力に対して適用され、-i の後に書いたオプションは出力に対して適用される。この区別を間違えると意図しない結果になることがある。
具体的な例:
# 最もシンプルな変換(フォーマット変換のみ)
ffmpeg -i input.mp4 output.avi
# 入力オプションあり(シーク位置を先に指定)
ffmpeg -ss 00:01:00 -i input.mp4 output_trimmed.mp4
# 出力オプションあり(ビットレートを指定)
ffmpeg -i input.mp4 -b:v 1M output.mp4
よく使うオプションの記号の読み方:
-c:v= コーデック ビデオ(映像コーデックの指定)-c:a= コーデック オーディオ(音声コーデックの指定)-b:v= ビットレート ビデオ-b:a= ビットレート オーディオ-r= フレームレート-s= サイズ(解像度)-ss= シーク開始位置-t= 長さ(秒数)-to= 終了時刻
動画フォーマットの変換
MP4 を AVI に変換
ffmpeg -i input.mp4 output.avi
FFmpeg は入力と出力のファイル拡張子を見て、適切なコーデックを自動で選択してくれる。シンプルな変換であればこれだけでいい。
MP4 を MKV に変換(再エンコードなし)
ffmpeg -i input.mp4 -c copy output.mkv
-c copy は「再エンコードせず、そのままコピー」という指示だ。変換が一瞬で終わり、画質も劣化しない。コンテナ(外側のファイル形式)だけを変えたい場合に使う。
MOV を MP4 に変換(iPhoneの動画変換によく使う)
ffmpeg -i input.mov -c:v libx264 -c:a aac output.mp4
iPhoneが撮影した .mov ファイルを、Web やSNSで使いやすい .mp4 に変換する定番コマンドだ。
音声の抽出・変換
動画から音声だけを抽出する
ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3
各オプションの説明:
-vn= ビデオなし(Video No)。映像ストリームを無視する-c:a libmp3lame= 音声を MP3 でエンコード-q:a 2= 音声品質。0が最高品質、9が最低品質
より高品質に抽出したい場合は AAC を使う。
ffmpeg -i input.mp4 -vn -c:a aac -b:a 192k output.m4a
音声ファイルのフォーマット変換
# WAV を MP3 に変換
ffmpeg -i input.wav -c:a libmp3lame -b:a 320k output.mp3
# MP3 を FLAC(可逆圧縮)に変換
ffmpeg -i input.mp3 -c:a flac output.flac
# 音声のビットレートを下げる(ファイルサイズを小さくする)
ffmpeg -i input.mp3 -b:a 128k output_compressed.mp3
動画の圧縮とクオリティ設定
ファイルサイズを小さくしながら、できるだけ画質を保つ方法を解説する。
H.265(HEVC)で圧縮する
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a aac output.mp4
-crf は品質と圧縮のバランスを決める値だ。
| CRF の目安 | 品質 | ファイルサイズ |
|---|---|---|
| 18 以下 | 非常に高い(ほぼ無劣化) | 大きい |
| 18〜23 | 高品質(通常はこの範囲) | 中程度 |
| 24〜28 | 許容範囲(Web 配信向け) | 小さめ |
| 28 以上 | 劣化が見える | 非常に小さい |
H.265 は H.264 と比べて約半分のファイルサイズで同等の画質を実現できる。ただし、エンコード時間は長くなる。
H.264 でエンコードする(互換性重視)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
-preset で速度と品質のトレードオフを選べる。
| preset | エンコード速度 | ファイルサイズ |
|---|---|---|
| ultrafast | 最速 | 最大 |
| fast | 速い | 大きめ |
| medium | バランス(デフォルト) | 中程度 |
| slow | 遅い | 小さめ |
| veryslow | 最遅 | 最小 |
# 速度重視(ライブ配信の録画処理など)
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 23 output.mp4
# 品質重視(アーカイブ用)
ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 18 output.mp4
動画の分割・カット
特定の時間帯を切り出す
ffmpeg -ss 00:01:30 -to 00:05:00 -i input.mp4 -c copy output_clip.mp4
-ss 00:01:30= 1分30秒の位置から開始-to 00:05:00= 5分00秒の位置で終了-c copy= 再エンコードなしでコピー(高速・無劣化)
-ss を -i の前に置くのが重要だ(Input Seeking)。これにより、先頭から全部デコードせず、指定位置に直接ジャンプするため処理が速い。
-t を使うと「長さ」で指定できる。
# 1分30秒から60秒間を切り出す
ffmpeg -ss 00:01:30 -t 60 -i input.mp4 -c copy output_clip.mp4
複数の動画を結合する
concat フィルターを使う方法(ファイルリスト)
まず、結合したいファイルのリストを作る(filelist.txt)。
file 'video1.mp4'
file 'video2.mp4'
file 'video3.mp4'
次に結合コマンドを実行する。
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output_merged.mp4
-f concat= 結合モード-safe 0= 相対パスや絶対パスを許可する-c copy= 再エンコードなし
同じコーデック・解像度の動画を結合するときはこの方法が最速だ。
異なる形式の動画を結合する場合
コーデックや解像度が異なる動画を結合するには、一度再エンコードが必要だ。
ffmpeg -i video1.mp4 -i video2.mp4 \
-filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output_merged.mp4
解像度・フレームレートの変更
解像度を変更する
# 1920x1080 にリサイズ
ffmpeg -i input.mp4 -s 1920x1080 output.mp4
# 幅を 1280px に固定し、アスペクト比を維持してリサイズ
ffmpeg -i input.mp4 -vf scale=1280:-2 output.mp4
# 高さを 720px に固定し、アスペクト比を維持してリサイズ
ffmpeg -i input.mp4 -vf scale=-2:720 output.mp4
scale=-2:720 の -2 は「アスペクト比を保ちながら、幅を偶数に丸めて自動計算」を意味する。(-2を使うことで幅が偶数に丸められ、多くのコーデックで必要な偶数幅が保証される)縦横比を崩さずにサイズを変えたいときはこれを使おう。
フレームレートを変更する
# 30fps に変更
ffmpeg -i input.mp4 -r 30 output.mp4
# 60fps に変更
ffmpeg -i input.mp4 -r 60 output.mp4
フレームレートを下げると(例: 60fps → 30fps)ファイルサイズが小さくなる。
字幕を動画に追加する
ソフトサブタイトル(字幕ファイルを別で保持)
ffmpeg -i input.mp4 -i subtitle.srt -c:v copy -c:a copy -c:s mov_text output.mp4
字幕ファイル(.srt)をデータとして動画に埋め込む方法。プレーヤー側で字幕の表示/非表示を切り替えられる。
ハードサブタイトル(字幕を映像に焼き込む)
ffmpeg -i input.mp4 -vf subtitles=subtitle.srt output.mp4
字幕を映像に完全に焼き込む方法。どのプレーヤーでも必ず表示されるが、後から消すことはできない。
画像から動画を作る(タイムラプス・スライドショー)
連番画像から動画を作る
# image001.png, image002.png ... という連番画像を動画にする
ffmpeg -framerate 24 -i image%03d.png -c:v libx264 -pix_fmt yuv420p output.mp4
-framerate 24= 1秒あたり24枚の画像を使用image%03d.png= 3桁ゼロ埋めの連番(001, 002, 003...)-pix_fmt yuv420p= 幅広い互換性のためのピクセルフォーマット
タイムラプス動画を作るときに便利だ。
1枚の画像からループ動画を作る
# 1枚の画像を10秒の静止動画にする
ffmpeg -loop 1 -i input.jpg -t 10 -c:v libx264 -pix_fmt yuv420p output.mp4
よくある質問(FAQ)
Q: FFmpeg で音量を上げる・下げるには?
# 音量を2倍にする
ffmpeg -i input.mp4 -af volume=2.0 output.mp4
# 音量を半分にする
ffmpeg -i input.mp4 -af volume=0.5 output.mp4
Q: 動画を90度・180度回転させるには?
# 90度時計回りに回転
ffmpeg -i input.mp4 -vf transpose=1 output.mp4
# 180度回転(hflip と vflip の組み合わせを使用する)
ffmpeg -i input.mp4 -vf "hflip,vflip" output.mp4
Q: 動画の再生速度を変えるには?
# 2倍速にする
ffmpeg -i input.mp4 -vf setpts=0.5*PTS -af atempo=2.0 output.mp4
# 0.5倍速(スロー)にする
ffmpeg -i input.mp4 -vf setpts=2.0*PTS -af atempo=0.5 output.mp4
Q: ファイルの情報を調べるには?
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
Q: 既存ファイルを強制上書きするには?
ffmpeg -y -i input.mp4 output.mp4
-y オプションで「上書きする」と指定できる。デフォルトでは上書きするか確認を求められる。
まとめ
FFmpeg のよく使うコマンドをまとめると:
| やりたいこと | コマンドの核 |
|---|---|
| フォーマット変換 | ffmpeg -i input.mp4 output.avi |
| 音声抽出 | -vn -c:a libmp3lame |
| 動画圧縮 | -c:v libx265 -crf 28 |
| 動画カット | -ss 開始 -to 終了 -c copy |
| 動画結合 | -f concat -i filelist.txt |
| 解像度変更 | -vf scale=1280:-2 |
| 字幕焼き込み | -vf subtitles=subtitle.srt |
最初は「圧縮して軽くしたい」「音声を取り出したい」といった一つのユースケースから始めて、徐々にオプションを覚えていくのが上達の近道だ。わからないことがあれば ffmpeg -help や公式ドキュメントも活用してほしい。