FFmpegは、無料で使えるオープンソース(プログラムの中身が公開されている)の動画処理ソフトです。変換、圧縮、カット、音声の取り出し、GIF作成など、動画に関するほとんどの作業を、コマンド1行で実行できます。
FFmpegとは
FFmpegは、音声と映像のあらゆる処理に使える、オープンソースのフレームワーク(ソフトと部品のまとまり)です。公式サイトのトップページでは、次のように紹介されています。
A complete, cross-platform solution to record, convert and stream audio and video.
主な特徴は次のとおりです。
- 無料・オープンソース(ライセンスはLGPLまたはGPL)
- Windows・macOS・Linux・BSDなどで動く(クロスプラットフォーム)
- コマンドで操作する(ボタンなどの操作画面はない。同じ処理の自動化がしやすい)
- 扱える形式が多い(コーデックとコンテナが数百種類)
- YouTube・Netflix・VLC・HandBrakeなどの裏側でも使われている
VLC、HandBrake、OBS、Adobe Premiereなど、多くの動画ソフトが、内部でFFmpegのライブラリ(libav*。ほかのソフトに組み込んで使う部品)を使っています。
コーデックとコンテナの違い(重要な前提知識)
FFmpegを使うときに、いちばん混同しやすいのがコーデックとコンテナです。
| 概念 | 説明 | 例 |
|---|---|---|
| コンテナ(ファイル形式) | 映像・音声・字幕などをまとめて入れる「入れ物」。拡張子で見分ける | .mp4, .mkv, .avi, .mov, .webm |
| コーデック(エンコード方式) | 映像や音声を圧縮し、再生のために元に戻す方式 | H.264, H.265, AV1, AAC, MP3, Opus |
よくある組み合わせは次のとおりです。
| ファイル名 | コンテナ | 映像コーデック | 音声コーデック |
|---|---|---|---|
video.mp4 |
MP4 | H.264 | AAC |
video.mkv |
Matroska | H.264 or H.265 | AAC or FLAC |
video.webm |
WebM | VP9 or AV1 | Vorbis or Opus |
video.mov |
QuickTime | ProRes or H.264 | AAC |
たとえばMP4をMKVにするときは、コーデックはそのままで、コンテナだけを替えられます。これをストリームコピーといいます。
FFmpegでできること(実例コマンド付き)
1. フォーマット変換(コンテナ変換)
映像と音声を圧縮し直さず(再エンコードせず)、コンテナだけを替えます。処理が速く、画質も音質も落ちません。
# MKV → MP4(コーデックはそのまま)
ffmpeg -i input.mkv -c copy output.mp4
2. エンコード・圧縮
映像を圧縮し直して、画質を保ちながらファイルを小さくできます。元の動画がすでに強く圧縮されていると、逆に大きくなることがあります。-crf は画質の目安で、数字が小さいほど高画質になり、ファイルは大きくなります。
# H.264圧縮(最も汎用)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac output.mp4
# H.265でさらに高圧縮(エンコードは遅くなる)
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a aac output.mp4
3. 動画のトリミング・カット
# 1分00秒から2分00秒を切り出し(高速・ストリームコピー)
ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -c copy output.mp4
4. 音声抽出
# 動画からMP3を抽出
ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3
# 無劣化でAACをそのまま抽出
ffmpeg -i input.mp4 -vn -c:a copy output.aac
5. GIF作成
# 動画全体をGIFアニメーションに変換
ffmpeg -i input.mp4 -vf "fps=15,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output.gif
6. 解像度変更(リサイズ)
# 1080p → 720pに変換
ffmpeg -i input_1080p.mp4 -vf scale=1280:-2 -c:v libx264 -crf 23 output_720p.mp4
7. ライブ配信(RTMP)
RTMPは、配信サービスへ映像を送るための通信方式です。YOUR_KEY の部分には、YouTube Studioに表示されるストリームキーを入れます。-g 60 は、キーフレーム(再生を始められる区切りの画面)を60フレームごとに入れる指定です。YouTubeの推奨は2秒ごと(4秒以内)なので、30fpsの動画なら60、60fpsなら120にします。
# YouTubeライブに配信
ffmpeg -re -i input.mp4 -c:v libx264 -b:v 4000k -g 60 -c:a aac -f flv rtmp://a.rtmp.youtube.com/live2/YOUR_KEY
FFmpegでできないこと
| できないこと | 理由・代替手段 |
|---|---|
| DRM(コピー防止)で保護された動画の解除 | 著作権法で守られている。FFmpegには、保護を外すための鍵を手に入れる機能はない |
| 画面を見ながらの編集 | コマンドで操作するソフトのため。画面で操作したいならHandBrakeやOpenShotなどを使う |
| タイムライン編集(非線形編集) | Adobe PremiereやDaVinci Resolveなどの動画編集ソフト(NLE)が必要 |
| AIによる高解像度化(アップスケーリング) | AIのモデルを動かす sr・dnn_processing フィルターはあるが、対応するビルド(DNNバックエンド入り)とモデルファイルが必要。gyan.devの配布版では使えないため、ふつうはReal-ESRGANなどの専用ツールを使う |
ffmpeg・ffprobe・ffplayの役割
| ツール | 役割 | 使いどき |
|---|---|---|
ffmpeg |
変換、圧縮(エンコード)、加工(フィルター)、配信 | 動画の処理のほとんど |
ffprobe |
ファイルの中身を調べる。メタデータ(作成日時などの付加情報)も確認できる | コーデック、解像度、フレームレートを確かめるとき |
ffplay |
テスト用の簡単な動画プレーヤー(SDLを使用) | フィルターの結果をすぐ確かめるとき |
# バージョン確認
ffmpeg -version
# ファイル情報を確認
ffprobe -v quiet -show_streams -print_format json input.mp4
# 動画を再生して確認
ffplay input.mp4
開発者向けライブラリ構成(libav*)
| ライブラリ | 役割 |
|---|---|
libavcodec |
エンコーダー(圧縮)とデコーダー(展開)の集まり |
libavformat |
コンテナへの格納(mux)と取り出し(demux) |
libavdevice |
デバイスの入出力(カメラ・マイクなど) |
libavfilter |
フィルターをつないだ処理(フィルタグラフ)の実行 |
libavutil |
各ライブラリが共通で使う機能 |
libswscale |
映像のサイズ変更と、画素の形式(ピクセルフォーマット)の変換 |
libswresample |
音声のサンプリング周波数(リサンプリング)や形式の変換 |
FAQ
Q1. FFmpegは有料ですか?
A. 無料です。ライセンスはLGPL v2.1以降(またはGPL v2以降)の、オープンソースのソフトです。条件を守れば、商用でも使えます。条件はFFmpegの法的情報のページにあります。
Q2. プログラミング知識がなくても使えますか?
A. 使えます。ターミナル(Windowsではコマンドプロンプト)を開いて、コマンドを入力できれば十分です。上のコマンドは、ファイル名を自分のファイルに変えれば、そのまま貼り付けて試せます。
Q3. WindowsとMacとLinux、どれでも動きますか?
A. 動きます。インストールの方法は違いますが、コマンドはほぼ同じです。フォルダの区切り文字(パス区切り文字)など、細かな違いはあります。
Q4. 対応しているフォーマットを確認するには?
A. 次のコマンドで一覧を表示できます。
# 対応フォーマット一覧
ffmpeg -formats
# 対応コーデック一覧
ffmpeg -codecs
# 利用可能エンコーダー一覧
ffmpeg -encoders
Q5. FFmpegとHandBrakeの違いは?
A. HandBrakeは、FFmpegのライブラリを内部で使う、画面で操作するソフト(GUIソフト)です。FFmpegはコマンドで操作するぶん自由度が高く、処理の自動化もできます。HandBrakeは画面で直感的に操作できますが、FFmpegほど細かくは設定できません。