ffmpeg

ffmpeg は強力(きょうりょく) なクロスプラットフォームマルチメディア処理(しょり) ツールで、動画(どうが)音声(おんせい)変換(へんかん)編集(へんしゅう) 、ストリーミングなどの操作(そうさ)可能(かのう) です。

基本構文

ffmpeg [global options] [[infile options] -i infile]... {[outfile options] outfile}...
区分説明
global optionsグローバルオプション。変換プロセス全体に影響(例:-y 自動上書き、-loglevel 出力詳細度設定)。
infile options入力ファイルまたはストリームへのパラメータ設定(例:開始時間 -ss、フォーマット指定 -f、デコーダ指定など)。
-i infile入力ソースを指定。ローカルファイル、リモートストリーム(HTTP/HTTPS)、HLS プレイリスト、RTSP/RTMP ストリーム、カメラデバイスなど。
outfile options各出力ファイルへの設定オプション(例:変換フォーマット、エンコーダ指定 -c:v、ビットレート、フィルタなど)。
outfile出力ファイル名とフォーマット。拡張子で出力フォーマットを決定。rtmp://udp:// などのストリームエンドポイントも指定可能。

入力ソース例

入力ソースタイプ説明
ローカルファイル-i video.mp4一般的な変換用
HTTP ストリーム-i https://example.com/clip.mp4リモート動画を直接読み取り
HLS プレイリスト-i https://example.com/stream.m3u8HLS ストリーム形式、ライブまたは VOD 対応
RTMP ストリーム-i rtmp://a.rtmp.server/live/123ライブストリーミングプラットフォームで使用
カメラデバイス-i /dev/video0Webcam 入力を読み取り(Linux)
デスクトップ録画-f x11grab -i :0.0デスクトップ画面を録画(Linux、-f が必要)

出力先例

出力先タイプ説明
AAC 音声出力output.aac音声抽出または .aac 形式に変換
MP4 出力output.mp4最も一般的な形式
HLS 出力output.m3u8 + -f hls動画を HLS プレイリストに変換
RTMP プッシュrtmp://live.server/app/streamライブストリーミングとして出力
音声デバイス出力-f alsa default (Linux)サウンドカードに再生

ヘルプコマンド

コマンド説明
-h基本オプションを表示
-h longより多くのオプションを表示
-h fullすべてのオプションを表示(codec とフォーマットの詳細を含む)
-h type=name指定コンポーネント(デコーダ/エンコーダなど)のオプションを表示
man ffmpeg完全なマニュアルを表示(Linux/Unix システム)

機能/能力オプション

コマンド説明
-Lライセンス条項を表示
-versionffmpeg バージョンを表示
-muxers利用可能な muxers(コンテナ化)を表示
-demuxers利用可能な demuxers(デコンテナ化)を表示
-devices利用可能なデバイス一覧を表示
-decoders利用可能なデコーダを表示
-encoders利用可能なエンコーダを表示
-filters利用可能なフィルタを表示
-pix_fmtsピクセルフォーマットを表示
-layouts標準チャンネルレイアウトを表示
-sample_fmts音声サンプルフォーマットを表示

グローバルオプション

オプション説明
-v <loglevel>ログレベルを設定(quiet, panic, fatal, error, warning, info, verbose, debug)
-y既存の出力ファイルを自動上書き
-n同名ファイルがある場合は上書きしない
-stats処理進捗を表示
-print_graphs実行グラフデータを stderr に出力
-print_graphs_file <filename>グラフを指定ファイルに出力
-print_graphs_format <format>グラフ出力形式を指定(default, csv, json, xml, mermaid など)

入力/出力ファイルオプション

共通(入力と出力両方に適用)

オプション説明
-f <fmt>コンテナ形式を強制指定(それ以外は自動判定)
-t <duration>持続時間を設定(秒)
-to <time_stop>停止時点を設定(HH:MM:SS)
-ss <time_off>開始時点を設定

出力のみ

オプション説明
-metadata[:<spec>] key=value出力ファイルに metadata を追加

ストリームごとのオプション

オプション説明
-c[:<stream_spec>] <codec>使用するエンコーダ/デコーダを指定(copy で再エンコードなし)
-filter[:<stream_spec>] <filter_graph>指定ストリームにフィルタを適用

stream_spec は以下が可能:

  • 整数番号(0, 1, 2…)
  • v(ビデオ)
  • a(オーディオ)
  • s(字幕)

ビデオオプション

オプション説明
-r[:<stream_spec>]フレームレートを設定
-aspect[:<stream_spec>]アスペクト比を設定(例:16:9、4:3)
-vnビデオを削除(音声のみ出力)
-vcodec <codec>-c:v のエイリアス、ビデオエンコーダを指定
-vf <filter_graph>-filter:v のエイリアス、ビデオフィルタを適用
-bビットレートを設定(-b:v を使用推奨)

オーディオオプション

オプション説明
-aq音声品質を設定(codec により異なる)
-ar[:<stream_spec>]サンプリングレートを設定(Hz)
-ac[:<stream_spec>]チャンネル数を設定(モノラル 1、ステレオ 2)
-an音声を削除(ビデオのみ出力)
-acodec <codec>-c:a のエイリアス、音声エンコーダを設定
-ab <bitrate>-b:a のエイリアス、音声ビットレートを設定
-af <filter_graph>-filter:a のエイリアス、音声フィルタを適用

字幕オプション

オプション説明
-sn字幕を削除
-scodec <codec>-c:s のエイリアス、字幕エンコーダを指定

入力処理

コマンド例説明
ffmpeg -i input.mp4 output.mp4ローカルファイルを読み取り
ffmpeg -i https://xxx.m3u8 -c copy output.tsHLS ストリームをダウンロードして保存
ffmpeg -i rtmp://live.server/app/stream -c copy out.flvRTMP ストリームをキャプチャ
ffmpeg -protocol_whitelist "file,http,https,tcp,tls,crypto" -i "https://xxx.m3u8" -c:a copy -vn output.aacHLS 音声をダウンロード

動画カット(再エンコードなし)

コマンド例説明
ffmpeg -ss 00:00:30 -t 00:00:10 -i input.mp4 -c copy cut.mp430 秒から 10 秒間をカット(高速)
ffmpeg -i input.mp4 -ss 30 -t 10 -c:v copy -c:a copy out.mp4同上、音声/ビデオのコピーを明示

音声処理

コマンド例説明
ffmpeg -i input.mp4 -vn -acodec copy output.aacAAC 音声を抽出
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -b:a 192k out.mp3MP3 に変換(サンプリングレートとビットレート設定)
ffmpeg -i input.wav -filter:a "volume=1.5" output.wav音量を上げる(1.5 倍)

ビデオ処理

コマンド例説明
ffmpeg -i input.mp4 -an -vcodec copy output.mp4音声を削除、ビデオのみ保持
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4解像度を 1280x720 に調整
ffmpeg -i input.mp4 -r 30 output.mp4出力を 30 FPS に設定
ffmpeg -i input.mp4 -vf "transpose=1" rotated.mp4動画を時計回りに 90 度回転

フレーム抽出 / スクリーンショット

コマンド例説明
ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 shot.png5 秒目の画面を画像として抽出
ffmpeg -i input.mp4 -vf fps=1 frames/out%d.png毎秒 1 フレームを抽出

フォーマット変換

コマンド例説明
ffmpeg -i input.mov -c:v libx264 -c:a aac output.mp4MOV → MP4(x264 + AAC)
ffmpeg -i input.mp4 -c:v libvpx -c:a libvorbis output.webmMP4 → WebM
ffmpeg -i input.mp4 -c:v copy -c:a copy output.mkv無損失コンテナ変換(MP4 → MKV)

ストリーミング配信

コマンド例説明
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/app/keyローカル動画を RTMP プラットフォームにプッシュ
ffmpeg -i input.mp4 -f hls out/index.m3u8動画を HLS 形式に分割

出力設定とその他のテクニック

コマンド例説明
ffmpeg -i input.mp4 -metadata title="My Video" out.mp4動画タイトル metadata を設定
ffmpeg -i input.mp4 -movflags faststart output.mp4MP4 の先頭を高速再生対応に(ウェブストリーミング向け)
ffmpeg -i input.mp4 -map 0 -c copy -f segment -segment_time 10 out%03d.mp4動画を 10 秒ごとにセグメント分割

ウォーターマーク追加

コマンド例説明
ffmpeg -i input.mp4 -vf "drawtext=text='Hello':fontcolor=white:x=10:y=10" -c:a copy out.mp4左上に白いテキストウォーターマークを追加
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" -c:a copy out.mp4画像ウォーターマークを追加(左上位置)
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=W-w-10:H-h-10" out.mp4ウォーターマークを右下に配置(幅高さ変数使用)

音声圧縮と処理

コマンド例説明
ffmpeg -i input.wav -c:a aac -b:a 96k output.m4a音声を AAC 96kbps に圧縮
ffmpeg -i input.mp4 -filter:a "volume=0.5" output.mp4音量を半分に下げる
ffmpeg -i input.mp4 -af "highpass=f=200, lowpass=f=3000" out.mp4ハイパス/ローパスフィルタを適用

動画圧縮

コマンド例説明
ffmpeg -i input.mp4 -vcodec libx264 -crf 28 -preset slow -acodec aac -b:a 96k out.mp4動画ファイルを圧縮(画質中程度、音声圧縮)
ffmpeg -i input.mp4 -vf scale=1280:-2 -c:v libx264 -crf 30 out.mp4解像度を縮小して圧縮
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a aac out.mp4H.265 で圧縮(より効率的)
-crf の値が高いほど圧縮が大きくなります(画質は低下)。推奨範囲:23(高画質)~30(小ファイル)

動画クロップ

コマンド例説明
ffmpeg -i input.mp4 -filter:v "crop=640:480:0:0" out.mp4640x480 領域をクロップ(左上から開始)
ffmpeg -i input.mp4 -filter:v "crop=in_w-100:in_h:50:0" out.mp4左右をクロップ、幅を 100 減らし、x 開始点を 50 に

動画 / 音声の結合

再エンコードなしで MP4 を結合(同じフォーマットが必要)

# まず input.txt を作成:
# file 'part1.mp4'
# file 'part2.mp4'
ffmpeg -f concat -safe 0 -i input.txt -c copy output.mp4

音声と動画を結合

ffmpeg -i video.mp4 -i audio.m4a -c:v copy -c:a aac -strict experimental out.mp4

動画の速度変更

コマンド例説明
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp42 倍速
ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" output.mp40.5 倍速(スローモーション)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" out.mp4動画高速化 + 音声同期処理

CRF と Preset の圧縮への影響

パラメータ説明
-crf NConstant Rate Factor:値が大きいほど圧縮が大きい(範囲 18~30、デフォルト 23)
-presetエンコード速度オプション:ultrafastsuperfastfastmediumslowveryslow。遅いほど圧縮効率が高い。

GIF 作成

ffmpeg -i input.mp4 -ss 00:00:05 -t 3 -vf "fps=10,scale=320:-1:flags=lanczos" out.gif

5 秒目から 3 秒間を GIF に変換。

RTP / SDP ストリーミング

MP4 を読み取って RTP でプッシュ

ffmpeg -re -i "input.mp4" -protocol_whitelist file,rtp,udp -map 0:v -c:v libx265 -c:a libmp3lame -f rtp rtp://127.0.0.1:20003

SDP ファイルを読み取り

ffmpeg -analyzeduration 5000000 -probesize 5000000 -protocol_whitelist file,crypto,udp,rtp -i test.sdp -vcodec libx264 -y out.h264

SDP ストリームを録画

ffmpeg -i a.sdp -protocol_whitelist "file,http,https,rtp,udp,tcp,tls" -vcodec copy -acodec aac -y output.mp4

ffplay 再生

# MP4 を再生
ffplay video.mp4 -vf scale=800:600 -af volume=0.2

# SDP ストリームを再生
ffplay -i test.sdp -protocol_whitelist "file,udp,rtp" -vf scale=800:600 -af volume=0.2

主要 Flag 説明

Flag説明
-c:vビデオエンコーダを設定
-c:a音声エンコーダを設定
-an音声を削除
-vnビデオを削除
-reリアルタイム速度で入力を読み取り、ストリーミング向け
-map 0ソースファイルのすべてのストリームを使用
-b:vビデオビットレートを設定
-crfConstant Rate Factor を設定
-pix_fmtピクセルフォーマットを指定(例:yuv420p, rgb24)
-protocol_whitelist許可するプロトコルを指定
-f rtp出力形式を RTP に設定

関連トピック