ffmpeg – 音声・動画の変換/編集/録画/抽出を行う多機能CLI

音声・動画エンコード

ffmpeg はあらゆる形式の音声・動画を入出力し、エンコード・デコード・フィルタ処理・切り出し・連結・録画などを行うコマンドラインツールです。
実務ではフォーマット変換、ビットレート/解像度変更、サムネ生成、クリップ作成、字幕焼き込み、連結、ストリーミングなどに使います。

構文(Syntax)

ffmpeg [GLOBAL_OPTIONS] {-i INPUT | -f demuxer -i INPUT} ... [MAPPING] [ENCODE_OPTIONS] OUTPUT

# 代表的な書式
ffmpeg -i IN.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k OUT.mp4

# クリップ(先頭5秒スキップして10秒間)
ffmpeg -ss 5 -i IN.mp4 -t 10 -c copy OUT.mkv

# フィルタ(スケール・FPS・字幕焼き込み)
ffmpeg -i IN.mp4 -vf "scale=1280:-2,fps=30,subtitles=sub.srt" OUT.mp4
  • 入力は複数指定可(-i を複数)。出力も複数可。
  • ストリーム選択-mapエンコード指定-c:v/-c:a 等、フィルタ-vf/-af/-filter_complex を使用。

主なオプション一覧

オプション説明使用例
-i INPUT入力を指定(複数可)ffmpeg -i in.mp4 ...
-c[:STREAM] CODEC / -codecコーデック指定(copy で再エンコードなし)-c:v libx264, -c:a aac, -c copy
-map SPEC入出力ストリームの明示的マッピング-map 0:v:0 -map 0:a:m:language:eng
-ss TIME先頭からのオフセットへシーク(入力/出力側どちらにも置ける)-ss 00:02:00 -i in.mp4
-t SEC / -to TIME長さ(秒)/終了時刻までを指定-t 10, -to 00:10:00
-vf FILTERS / -af FILTERS映像/音声フィルタ-vf "scale=1280:-2,fps=30"
-r FPSフレームレート設定(入力/出力で意味が異なる)-r 30
-b:v RATE / -b:a RATE固定ビットレート-b:v 4M -b:a 192k
-crf N(x264/265)品質(小さいほど高品質・大きいほど低ビットレート)-crf 23
-preset NAME(x264/265)速度/圧縮率のトレードオフ-preset veryslow
-pix_fmt FMTピクセルフォーマット-pix_fmt yuv420p
-movflags +faststartMP4 のメタを先頭へ移動(Web再生向け)-movflags +faststart
-an / -vn / -sn音声/映像/字幕を除去-an
-shortest最も短いストリームに出力を揃える-shortest
-f MUXER出力フォーマットを明示-f mp4, -f concat
-y / -n出力上書き許可/禁止-y
-threads Nエンコードスレッド数-threads 8
HWエンコーダ例GPU等のハードウェアを利用-c:v h264_nvenc / hevc_nvenc / h264_qsv / h264_videotoolbox

-ss入力の前に置くと高速(キーフレーム単位)。入力の後に置くと精密(再エンコードが必要になりやすい)。

実行例

高品質なH.264/AACに変換(Web再生向け最小公倍数)

説明: 互換性の高い設定でエンコードし、ストリーミング開始を速くします。
コマンド:

ffmpeg -i in.mov \
  -c:v libx264 -crf 22 -preset medium -pix_fmt yuv420p \
  -c:a aac -b:a 192k \
  -movflags +faststart out.mp4

再エンコードせずに部分切り出し(高速・キーフレーム境界)

説明: 5秒地点から10秒分をコピー
コマンド:

ffmpeg -ss 5 -i in.mp4 -t 10 -c copy clip.mkv

※ カット位置が厳密でない場合があります(キーフレーム依存)。

音声だけを抽出してMP3に変換

説明: 映像を除去し、可変品質でエンコード。
コマンド:

ffmpeg -i in.mp4 -vn -c:a libmp3lame -q:a 2 out.mp3

複数ファイルを連結(同じコーデック/パラメータ)

説明: concatデマルチプレクサを使い、再エンコードなしで連結。
コマンド:

# mylist.txt(各行)
# file '/path/to/a.mp4'
# file '/path/to/b.mp4'
ffmpeg -f concat -safe 0 -i mylist.txt -c copy merged.mp4

720p・30fpsに変換+英語字幕を焼き込み

説明: 画質・サイズを揃え、外部SRT字幕を映像に焼き込みます。
コマンド:

ffmpeg -i in.mkv -vf "scale=-2:720,fps=30,subtitles='sub_en.srt'" \
  -c:v libx264 -crf 23 -preset fast -c:a aac -b:a 160k out.mp4

エラー例:未インストールのエンコーダ指定

説明: libx264 が無い環境で指定すると失敗します。
コマンド:

ffmpeg -i in.y4m -c:v libx264 out.mp4

出力例(例):

Unknown encoder 'libx264'

対処: そのコーデックを含むビルドを入れるか、利用可能なコーデック(ffmpeg -encoders)を選択。

関連コマンド

  • ffprobe : メディアのメタデータ/ストリーム情報を表示(解析に便利)。
  • ffplay : シンプルな再生プレイヤー(動作確認)。
  • sox / mediainfo : 音声処理・メタ情報確認の補助ツール。
  • mp4box(GPAC) : MP4 最適化・分割/結合の補助。

備考

  • ストリーム選択: 多音声/多字幕では -map を明示しないと自動選択に依存します。確実にしたい場合は -map 0:v:0 -map 0:a:0 -map 0:s? のように指定。
  • 品質パラメータ: H.264/265 の -crf は一般に 18–28 が実用範囲。-preset は遅いほど圧縮効率が上がります。
  • 色空間/互換性: Web/再生機器互換のため -pix_fmt yuv420p を指定するのが無難。
  • 正確なカット: 精密カットは -i の後に -ss(および -to/-t)を置き、必要に応じ再エンコード。
  • 字幕: 焼き込みは映像フィルタ(subtitles)で不可逆。可逆にしたい場合はコンテナにソフト字幕として多重化(例: -c:s mov_text で MP4)。
  • ハードウェアエンコード: h264_nvenc(NVIDIA)、hevc_nvench264_qsv(Intel)、h264_videotoolbox(macOS)など。画質/速度/機能はドライバ・GPUに依存。
  • 入出力の自動検出: 拡張子でなく実データで判定します。うまく読めない場合は -f で明示。
  • 安全上の注意: 既存ファイルを上書きする際は -y を付けるか、省略して確認プロンプトに注意。
  • ビルド差: ディストリや配布元により含まれるコーデックが異なります(特に AAC、x264/x265、各HWエンコーダ)。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント