FFmpegは「なんとなく知っている」から「使いこなせる」までの壁が少し高い。コマンドの書き方は独特だし、オプションの数は膨大だし、エラーメッセージは英語だ。
でも実は、よく使うコマンドはそんなに多くない。この記事では実務で頻出する操作を、入門から応用まで コピペで使えるコマンド として解説する。
この記事でわかること
- FFmpegコマンドの基本構造とオプションの読み方
- 動画変換・音声抽出・圧縮・カット・結合
- GIF変換・サムネイル抽出・画像から動画作成
- ウォーターマーク・字幕・クロップ・ノイズ除去
- ffprobeでメディア情報を詳しく調べる方法
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:v libx264 |
-c:a | 音声コーデック | -c:a aac |
-b:v | 映像ビットレート | -b:v 2M |
-b:a | 音声ビットレート | -b:a 192k |
-r | フレームレート | -r 30 |
-s | 解像度 | -s 1920x1080 |
-ss | シーク開始位置 | -ss 00:01:30 |
-t | 長さ(秒数) | -t 60 |
-to | 終了時刻 | -to 00:05:00 |
-vn | 映像なし | 音声のみ抽出時 |
-an | 音声なし | 無音動画出力時 |
動画フォーマットの変換
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が最低品質。2で十分な高音質
より高品質に抽出したい場合は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
動画の圧縮とクオリティ設定
ファイルサイズを小さくしながら、できるだけ画質を保つ。FFmpegで最もよく使う操作の一つだ。
コーデック選びに迷ったら H.264 vs H.265 vs AV1 徹底比較 を参考にしてほしい。
H.265(HEVC)で圧縮する
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a aac output.mp4
-crf(Constant Rate Factor)は品質と圧縮のバランスを決める値だ。
| 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
CRFとpresetの組み合わせをさらに詳しく知りたい場合は FFmpeg動画圧縮 完全ガイド を参照してほしい。GPUを使ってエンコード速度を劇的に上げる方法は FFmpeg GPUエンコード ガイド で解説している。
動画の分割・カット・結合
特定の時間帯を切り出す
# 1分30秒から3分30秒間を切り出す(= 1:30〜5:00)
ffmpeg -ss 00:01:30 -t 00:03:30 -i input.mp4 -c copy output_clip.mp4
-ss 00:01:30= 1分30秒の位置から開始-t 00:03:30= 3分30秒間を切り出す-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
終了時刻で指定したい場合は、-ss と -to の両方を -i の後に置く。
# 1分30秒から5分00秒まで(-toは入力の絶対時刻)
ffmpeg -i input.mp4 -ss 00:01:30 -to 00:05:00 -c copy output_clip.mp4
この場合は全フレームをデコードするため -ss before -i より遅いが、-to が入力ファイルの絶対時刻として確実に動作する。
複数の動画を結合する
同じコーデック・解像度の動画を結合する場合、ファイルリストを作る方法が最速だ。
まず filelist.txt を用意する。
file 'video1.mp4'
file 'video2.mp4'
file 'video3.mp4'
次に結合コマンドを実行する。
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output_merged.mp4
異なる形式の動画を結合する場合
コーデックや解像度が異なる動画を結合するには、再エンコードが必要だ。
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 は「アスペクト比を保ちながら、値を偶数に丸めて自動計算」を意味する。多くのコーデックは偶数解像度を要求するため、-1 ではなく -2 を使うのが安全だ。
フレームレートを変更する
# 30fpsに変更
ffmpeg -i input.mp4 -r 30 output.mp4
# 60fpsに変更
ffmpeg -i input.mp4 -r 60 output.mp4
フレームレートを下げると(例: 60fps → 30fps)ファイルサイズが小さくなる。
GIF変換・サムネイル抽出・画像から動画
動画をGIFに変換する
単純に変換するとファイルサイズが大きく、色が汚くなる。パレット最適化 を使うと品質が大幅に向上する。
# Step 1: パレットを生成
ffmpeg -i input.mp4 -vf "fps=15,scale=480:-2:flags=lanczos,palettegen" palette.png
# Step 2: パレットを使ってGIFに変換
ffmpeg -i input.mp4 -i palette.png \
-lavfi "fps=15,scale=480:-2:flags=lanczos[x];[x][1:v]paletteuse" output.gif
各オプションの意味はこうだ。
fps=15= 15フレーム/秒に削減(GIFにはこれで十分)scale=480:-2= 幅480pxにリサイズflags=lanczos= 高品質なリサイズアルゴリズムpalettegen/paletteuse= 動画の色分布に最適化したパレットを使用
1コマンドでパレット生成と変換を同時にやる方法もある。
ffmpeg -i input.mp4 \
-lavfi "fps=15,scale=480:-2:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
output.gif
動画からサムネイルを抽出する
# 特定の時間(10秒地点)のフレームを1枚抽出
ffmpeg -ss 10 -i input.mp4 -frames:v 1 thumbnail.jpg
# 一定間隔(10秒ごと)でフレームを抽出
ffmpeg -i input.mp4 -vf "fps=1/10" thumbnail_%03d.jpg
# キーフレームだけを抽出(最速)
ffmpeg -skip_frame nokey -i input.mp4 -fps_mode vfr keyframe_%03d.jpg
-frames:v 1 は「映像フレームを1枚だけ出力」の意味。fps=1/10 は「10秒あたり1フレーム」だ。
連番画像から動画を作る
# 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枚の画像からループ動画を作る
ffmpeg -loop 1 -i input.jpg -t 10 -c:v libx264 -pix_fmt yuv420p output.mp4
SNSのサムネイルやプレゼン用の背景動画に使える。
ウォーターマーク・字幕・クロップ・ノイズ除去
ウォーターマーク(透かし)を追加する
# 右下にロゴを配置(10pxマージン)
ffmpeg -i input.mp4 -i logo.png \
-filter_complex "overlay=W-w-10:H-h-10" output.mp4
overlay フィルタの座標指定はこう読む。
W/H= 入力動画の幅/高さw/h= オーバーレイ画像の幅/高さW-w-10= 右端からロゴ幅+10pxの位置
よく使う配置パターンをまとめておく。
| 位置 | overlay の値 |
|---|---|
| 左上 | overlay=10:10 |
| 右上 | overlay=W-w-10:10 |
| 左下 | overlay=10:H-h-10 |
| 右下 | overlay=W-w-10:H-h-10 |
| 中央 | overlay=(W-w)/2:(H-h)/2 |
テキストを動画に描画する
ffmpeg -i input.mp4 \
-vf "drawtext=text='Sample':fontsize=24:fontcolor=white:x=10:y=10" \
output.mp4
ソフトサブタイトル(字幕ON/OFFが可能)
ffmpeg -i input.mp4 -i subtitle.srt -c:v copy -c:a copy -c:s mov_text output.mp4
字幕をデータとして埋め込む方法。プレーヤー側で表示/非表示を切り替えられる。
ハードサブタイトル(映像に焼き込む)
ffmpeg -i input.mp4 -vf subtitles=subtitle.srt output.mp4
字幕を映像に焼き込む方法。どのプレーヤーでも表示されるが、後から消せない。
AIによる自動字幕生成に興味があれば FFmpeg × Whisperで自動字幕を生成する方法 を読んでほしい。
動画をクロップ(切り抜き)する
# 中央から640x480を切り抜く
ffmpeg -i input.mp4 -vf "crop=640:480" output.mp4
# 左上から指定サイズを切り抜く
ffmpeg -i input.mp4 -vf "crop=640:480:0:0" output.mp4
# 上下の黒帯を自動検出して除去
ffmpeg -i input.mp4 -vf "cropdetect" -f null - 2>&1 | grep cropdetect
crop フィルタの書式は crop=幅:高さ:x:y だ。x, y を省略すると中央からの切り抜きになる。
黒帯除去は2ステップで行う。まず cropdetect で検出値を確認し、その値を crop に指定する。
# cropdetectの出力例: crop=1920:800:0:140
ffmpeg -i input.mp4 -vf "crop=1920:800:0:140" output.mp4
ノイズ除去
映像のノイズ除去には nlmeans(Non-Local Means)フィルタが使える。
ffmpeg -i input.mp4 -vf "nlmeans=s=3.5:p=7:r=15" output.mp4
s= ノイズ除去の強度(大きいほど強い。デフォルト1.0)p= パッチサイズ(奇数。デフォルト7)r= 検索範囲(奇数。デフォルト15)
音声のノイズ除去には arnndn(Recurrent Neural Network)フィルタが使える。モデルファイルは別途ダウンロードが必要だ。
# モデルをダウンロード(初回のみ)
curl -LO https://github.com/richardpl/arnndn-models/raw/master/bd.rnnn
# ノイズ除去を実行
ffmpeg -i input.mp4 -af "arnndn=m=bd.rnnn" output.mp4
モデルファイルは arnndn-models リポジトリで配布されている。bd.rnnn は汎用ノイズ除去モデルで、会議録音やポッドキャストの背景ノイズ除去に効果的だ。
ffprobeでメディア情報を調べる
ffprobe はFFmpegと一緒にインストールされるメディア情報分析ツールだ。変換前にコーデック・解像度・ビットレートなどを確認するのに使う。
基本的な情報を表示する
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
-v quiet= FFmpegのバナー表示を抑制-print_format json= JSON形式で出力-show_format= コンテナ情報(フォーマット、長さ、ビットレート)-show_streams= 各ストリーム情報(コーデック、解像度、fps)
よく使うffprobeコマンド
# 動画の解像度だけを表示
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height -of csv=p=0 input.mp4
# 動画の長さ(秒)だけを表示
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
# コーデック名を表示
ffprobe -v error -select_streams v:0 \
-show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 input.mp4
エンコード前に元ファイルの情報を確認する習慣をつけておくと、意図しない変換結果を防げる。
よくある質問(FAQ)
Q: 音量を上げる・下げるには?
# 音量を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度回転
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: 既存ファイルを強制上書きするには?
ffmpeg -y -i input.mp4 output.mp4
-y で上書き確認をスキップできる。
Q: 商用プロジェクトでFFmpegを使うときのライセンスは?
GPLとLGPLの違い、再配布時の注意点は FFmpeg商用ライセンスガイド で詳しく解説している。
次のステップ:FFmpegの学び方
ここまでのコマンドを一通り試したら、次は体系的に深掘りしていこう。
公式ドキュメント
英語だが、コマンドリファレンスとしては最も正確で網羅的だ。
- FFmpeg公式ドキュメント: https://ffmpeg.org/documentation.html
- FFmpeg Wiki: https://trac.ffmpeg.org/wiki — 実践的なハウツー記事が充実
- manページ: ターミナルで
man ffmpegを実行すると全オプションが確認できる
学習の進め方
FFmpegはリファレンスを読むより手を動かすほうが身につく。以下のステップで進めるといい。
- 基本コマンド(この記事の内容) — フォーマット変換、音声抽出、カット
- フィルターグラフ —
scale、cropから始めてfilter_complexへ。動画圧縮ガイド でCRFの使い分けを深掘り - エンコードパラメーター — CRF・ビットレート制御、コーデック固有オプション(x264, x265, SVT-AV1)。GPUエンコードガイド でハードウェア活用も
- 自動化・スクリプト化 — Python連携 でバッチ処理、VPSエンコードサーバー でリモート化
コミュニティ
- Stack Overflow —
ffmpegタグで大量のQ&Aが蓄積されている - Reddit r/ffmpeg — 実践的な使い方の議論が活発
- FFmpegメーリングリスト (
ffmpeg-user@ffmpeg.org) — コア開発者が直接回答することもある
まとめ
FFmpegのよく使うコマンドを一覧にまとめておく。
| やりたいこと | コマンドの核 |
|---|---|
| フォーマット変換 | ffmpeg -i input.mp4 output.avi |
| 再エンコードなし変換 | -c copy |
| 音声抽出 | -vn -c:a libmp3lame |
| H.265圧縮 | -c:v libx265 -crf 28 |
| 動画カット | -ss 開始 -to 終了 -c copy |
| 動画結合 | -f concat -i filelist.txt |
| 解像度変更 | -vf scale=1280:-2 |
| GIF変換 | palettegen + paletteuse |
| サムネイル抽出 | -frames:v 1 |
| ウォーターマーク | -filter_complex overlay=... |
| 字幕焼き込み | -vf subtitles=subtitle.srt |
| クロップ | -vf crop=幅:高さ:x:y |
| ノイズ除去 | -vf nlmeans / -af arnndn |
まずは「動画を圧縮したい」「音声を取り出したい」といった一つのユースケースから始めて、少しずつオプションを覚えていくのが上達の近道だ。
もっと自動化したくなったら、Pythonとの連携がおすすめだ。
- FFmpeg × Pythonバッチ処理入門 — 大量の動画を一括変換するスクリプトの書き方
FFmpegの処理をローカル PC から切り離したい場合は、VPS にエンコード専用サーバーを立てる選択肢もある。
国内シェアNo.1のエックスサーバーが提供する高性能VPS
- NVMe SSD・AMD EPYC搭載の高速サーバー
- 2GBプラン 月額990円〜(3コア / 50GB SSD)
- 初期費用無料