動画ファイルを扱っていると、動画形式の変換やファイルサイズの圧縮、音声の抜き出しといった加工を行いたい場面があります。
そこで活用できるのが「FFmpeg」です。
有料の動画編集ソフトやオンライン変換サービスとは異なり、無料でありながらコマンド一つで変換から圧縮、音声抽出まで幅広い加工をまとめて実行できる点が特徴です。
本記事では、FFmpegのインストール方法から基本的な使用方法、よく使われる加工方法などについて解説します。
FFmpegとは
FFmpegとは何か
FFmpegは、動画や音声などのマルチメディアデータを処理するためのオープンソースソフトウェアです。
コマンドラインから操作できる点が特徴で、GUIアプリケーションでファイルを開いて設定する代わりに、コマンドを入力するだけで動画や音声を処理できます。
「FFmpeg」という名前は、早送りを意味する「Fast Forward」と、動画・音声の国際規格を策定する団体「Moving Picture Experts Group(MPEG)」に由来します。2000年にフランスのプログラマーであるFabrice Bellard氏が開発をはじめ、現在も世界中の開発者によって継続的に改良が続けられています。
また、FFmpegは単一の機能だけを持つツールではなく、動画や音声の変換を行うffmpeg、メディアファイルの情報を確認するffprobe、簡易的なメディアプレーヤーであるffplayなどのツールが含まれています。
FFmpegでできること
FFmpegでは、動画や音声に対して様々な処理を実行できます。
代表的な処理として、次のようなものがあります。
- 動画ファイルの形式を変換する
- 動画を圧縮してファイルサイズを小さくする
- 動画から音声を抽出する
- 動画の一部分を切り出す
- 動画の解像度を変更する
- 複数の動画を結合する
- 動画から画像を生成する
FFmpegでは、映像や音声を変換するための様々なフィルターや、スケーリングなどの機能が提供されています。
そのため、動画編集ソフトを使うほどではない簡単な加工であれば、FFmpegだけで処理できるケースもあります。
FFmpegの活用場面
FFmpegは、個人で動画を扱う場合だけでなく、ソフトウェア開発やサーバー上での動画処理などにも利用されています。
例:
- ファイル形式の統一 … 異なる形式で保存された動画を、指定した形式に統一する
- Webサービス上での動画処理 … 動画投稿機能などを持つWebサービスでの変換・加工処理に利用する
- 動画ファイルの整理 … 音声の抽出や必要な部分のみの切り出し、サムネイル画像の一括生成などに利用する
特に、同じ処理を大量のファイルに対して行う場合、コマンドラインツールであるFFmpegのメリットが大きくなります。
例えば、シェルのループ処理と組み合わせると、フォルダ内の複数ファイルを一括で変換できます。
for f in *.mov; do
ffmpeg -i "$f" "${f%.mov}.mp4"
doneこのように、input.movのような特定の拡張子を持つファイルをまとめて処理できるため、動画ファイルが大量にある場合でも作業を効率化できます。
FFmpegをインストールする
Windowsへのインストール
Windowsの場合は、Microsoftの公式パッケージマネージャーである「winget」を使用するのが最も簡単な方法です。
以下のコマンドを実行すると、Gyan.devが提供するFFmpegのビルドをインストールできます。
winget install --id=Gyan.FFmpeg -eインストール後は、PowerShellやコマンドプロンプトで次のコマンドを実行しましょう。
ffmpeg -versionFFmpegのバージョン情報が表示されれば、正常にインストールが完了しています。
手動でインストールする場合は、公式ダウンロードページで案内しているリンク先から、Windows向けのビルドを入手できます。
ダウンロードしたファイルを解凍し、FFmpegの実行ファイルがあるbinフォルダのパスを環境変数に追加する必要があります。
macOSへのインストール
macOSの場合は、Homebrewを利用することでFFmpegを簡単にインストールできます。
Homebrewがインストールされている状態で、以下のコマンドを実行しましょう。
brew install ffmpeg
インストールが完了したら、次のコマンドを実行します。
ffmpeg -version以下のようにバージョン情報が表示されれば、FFmpegを利用可能です。
なお、macOSでFFmpegをソースコードからビルドする場合は、Xcodeのツールチェーンなどを利用できます。
Linuxへのインストール
Linuxの場合は、ディストリビューションのパッケージマネージャーを使用するのが最も簡単な方法です。
例えば、UbuntuやDebian系の環境では、以下のコマンドを利用できます。
sudo apt update
sudo apt install ffmpegインストール後に以下のコマンドを実行し、バージョン情報が表示されれば完了です。
ffmpeg -versionただし、Rocky LinuxやAlmaLinuxといったRHEL系の場合は、標準リポジトリにFFmpegが含まれていないため、EPELやRPM Fusionなどのリポジトリを追加してからインストールする必要があります。
はじめての動画変換をやってみる
FFmpegコマンドの基本構造
FFmpegを利用する時は、ターミナルやコマンドプロンプトからffmpegコマンドを実行します。
コマンドの基本的な構文は、以下の通りです。
ffmpeg [グローバルオプション] [入力オプション] -i 入力ファイル [出力オプション] 出力ファイル# input.mp4 を output.avi に変換
ffmpeg -i input.mp4 output.aviグローバルオプションは FFmpeg全体に影響するオプション、入力オプションと出力オプションはそれぞれ入出力に関連するオプションとなります。
入力ファイルの前に書いたオプションは入力オプション、出力ファイルの前に書いたオプションは出力オプションとして直後のファイルに適用されるため、コマンドを実行する際は記述順に気を付ける必要があります。
実際に動画を変換してみる
それでは、実際に動画を変換してみましょう。
ここでは、input.movという動画ファイルをMP4形式に変換してみます。
ffmpeg -i input.mov output.mp4コマンドを実行すると、FFmpegが入力動画を解析し、変換処理を開始します。
処理中は、以下のようにフレーム数や処理時間、ファイルサイズなどの情報が表示されます。
入力動画のコーデックなどによっては、期待した形式にならなかったり、再生できないファイルが生成されたりする場合があります。
その際は、使用する映像コーデックや音声コーデックを明示的に指定しましょう。
例:
ffmpeg -i input.mov -c:v libx264 -c:a aac output.mp4-c:vは映像コーデック、-c:aは音声コーデックを指定するオプションです。
ケースによっては必要となる処理のため、合わせて覚えておくと便利です。
ffprobeで変換後の動画を確認する
動画の変換が完了したら、実際にどのようなファイルになったかを確認してみましょう。
FFmpegには、メディアファイルの詳細情報を確認するためのffprobeというツールが付属しています。
基本的な使い方は以下のとおりです。
ffprobe output.mp4実行すると、動画の形式や映像・音声のコーデック、解像度、フレームレート、再生時間などの情報が表示されます。
動画を変換した後にffprobeで確認することで、指定したコーデックや解像度になっているかを確認できます。
FFmpegでよく使う変換・加工操作
動画を圧縮してファイルサイズを小さくする
FFmpegでは、映像の品質を調整することでファイルサイズを小さくできます。
例:
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -c:a aac output.mp4
-crfオプションは、H.264形式などで画質とファイルサイズのバランスを調整するための値です。
一般的に、CRFの値を大きくすると圧縮率が高くなり、ファイルサイズは小さくなる一方で画質は低下します。
反対に、値を小さくすると画質が高くなる一方で、ファイルサイズは大きくなります。
動画から音声だけを抽出する
動画から音声だけを取り出したい場合にも、FFmpegを利用できます。
例:
ffmpeg -i input.mp4 -vn output.mp3-vnは、映像(video)を出力しないことを指定するオプションです。
これによって、入力動画に含まれている音声だけを取り出せます。
音声コーデックを指定する場合は、次のようにします。
ffmpeg -i input.mp4 -vn -c:a libmp3lame output.mp3また、元の動画に含まれている音声をそのまま取り出せる場合は、ストリームコピーを利用できます。
ffmpeg -i input.mp4 -vn -c:a copy output.m4a動画の一部分を切り出す
FFmpegを利用して、動画の特定の部分だけを切り出すこともできます。
例:
# 30秒から50秒までの20秒間を切り出してoutput.mp4として保存
ffmpeg -ss 00:00:30 -i input.mp4 -t 20 output.mp4・ -ss … 開始地点を指定
・ -t 20 … 出力時間を指定
切り出し方には、再エンコードする方法とストリームコピーを利用する方法があります。
ストリームコピーは処理が高速ですが、キーフレームの位置などによっては正確に切り出せない場合があるため、注意が必要です。
動画の解像度を変更する
動画の解像度を変更する場合は、-vfオプションを使用できます。
例:
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4「scale=幅:高さ」 の形式で、出力する映像の幅と高さを指定できます。
縦横比を維持しながら幅だけを指定する場合は、高さに-2を指定します。
ffmpeg -i input.mp4 -vf scale=1280:-2 output.mp4これにより、元の縦横比を維持した高さが自動的に計算されます。
「-1」ではなく「-2」を指定すると、H.264などのコーデックで必須となる偶数のピクセル数に自動調整されるため、エンコードエラーを避けられます。
複数の動画を結合する
複数の動画を1本につなげる処理も、FFmpegで実行できます。
例えば、video1.mp4とvideo2.mp4を結合する場合、まず次のような内容のテキストファイルを作成します。
file 'video1.mp4'
file 'video2.mp4'そして、以下のコマンドを実行します。
ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4-f concatオプションで、複数のファイルを連結するためのconcat形式を使用できます。
ただし、結合する動画の形式やコーデックなどが揃っている必要があるため、使用時には注意しましょう。
動画からサムネイル画像を生成する
FFmpegでは、動画の特定の時点から静止画を生成することもできます。
例:
ffmpeg -ss 00:00:10 -i input.mp4 -frames:v 1 thumbnail.jpg
-frames:v 1は、映像を1フレームだけ出力する指定です。
これにより、特定時点のフレームを静止画として保存できます。
動画をGIFに変換する
動画の一部をアニメーションGIFにしたい場合にも、FFmpegを利用できます。
例:
ffmpeg -i input.mp4 -vf "fps=10,scale=480:-2" output.gif-vfオプションのfpsでフレームレート、scaleで幅を指定しています。
GIFはファイルサイズが大きくなりやすいため、フレームレートや幅を抑えて軽量化するのがポイントです。より高画質なGIFを作りたい場合は、palettegen・paletteuseフィルターを使った配色最適化も検討しましょう。
FFmpegを使うために知っておきたい基礎知識
コンテナとコーデックの違い
動画を扱うときに混同しやすいのが、「コンテナ」と「コーデック」です。
簡単に説明すると、コンテナは映像や音声などをまとめて入れておくファイル形式、コーデックは映像や音声を圧縮・復号する方式です。
例えば、よく利用されるMP4はコンテナ形式の一つです。
そして、映像や音声をどのような方式で圧縮するかをコーデックによって決めます。
実際に動画を扱う際には、どのコンテナに、どのコーデックの映像・音声を格納するのかを意識することが重要です。
再エンコードとストリームコピーの違い
FFmpegを使うときにもう一つ重要なのが、「再エンコード」と「ストリームコピー」の違いです。
再エンコードとは、入力された映像や音声を一度デコードし、別の設定でエンコードし直す処理のことを言います。
画質やファイルサイズを調整できるというメリットがある一方で、処理に時間がかかり、非可逆圧縮の場合は画質が変化する可能性があります。
一方、ストリームコピーは、映像や音声をそのままコピーする方法です。
処理が高速な点と、元の映像や音声データをそのまま利用できる点がメリットですが、異なるコーデックへの変換や、映像そのものに加工を加える処理には利用できません。
解像度の変更などを行う場合は、映像を処理する必要があるため、基本的に再エンコードが必要です。
よく使うFFmpegオプション
FFmpegには非常に多くのオプションがありますが、まずは以下のような、よく使うオプションを覚えておくと便利です。
なお、-presetの値を大きく(低速側に)するほど処理時間は長くなります。
大量の動画を高速に処理したい場合は、NVIDIA製GPUのNVENCやApple SiliconのVideoToolboxなど、ハードウェアエンコード(例:-c:v h264_nvenc)を利用する方法もあります。
プログラムからFFmpegを呼び出す際の注意点
Node.jsやPythonなどのプログラムからFFmpegを呼び出し、Webサービス上でアップロードされた動画を自動変換するケースも多くあります。
この際、ユーザーが指定したファイル名やオプションを文字列としてそのままコマンドに埋め込むと、コマンドインジェクションの脆弱性につながる恐れがあります。
Node.jsの場合はchild_processの execではなくspawnを、Pythonの場合はshell=Trueを避けたsubprocess.runを使い、コマンドと引数を配列として渡すようにしましょう。
注意点とよくあるエラー
「command not found」と表示される
ターミナルでFFmpegを実行したときに、以下のようなメッセージが表示される場合があります。
ffmpeg: command not found主な原因として考えられるのは、以下の3つです。
・FFmpegがインストールされていない
・FFmpegのPATHが設定されていない
・PATHの設定後にターミナルを再起動していない
特に、パッケージマネージャーを利用せずにビルドを手動でインストールした場合は、PATHの設定が必要となるので注意が必要です。
入力ファイルが見つからない
ファイルの変換時に、以下のようなエラーが表示される場合があります。
No such file or directoryこの場合は、指定したファイル名やパスに間違いがないかを確認しましょう。
スペルミスや拡張子の指定ミス、ディレクトリの指定ミスなどによって、ファイルが見つからない可能性があります。
コーデック関連のエラーが表示される
FFmpegでは、入力ファイルや出力先のコンテナに対応していないコーデックを指定した場合などに、コーデック関連のエラーが発生することがあります。
このような場合は、まず入力ファイルにどのような映像・音声が含まれているかをffprobeで確認すると、原因を特定しやすくなります。
ffprobe input.mp4また、出力するコンテナに適したコーデックを指定することも重要です。
FFmpegを利用する際はライセンスを確認する
FFmpegはオープンソースソフトウェアですが、利用時にはライセンスについて確認する必要があります。
特に注意したいのが、FFmpeg本体だけではなく、組み込まれている外部ライブラリやコーデックのライセンスも確認する必要があるという点です。
業務や製品開発でFFmpegを利用する場合は、利用するFFmpegのビルド、含まれるライブラリ、利用方法を確認した上でライセンス条件に従うことが重要です。
FFmpegに関するよくある質問
Q. FFmpegは無料で使えますか?
A. FFmpegはオープンソースソフトウェアのため、無料でダウンロード・利用できます。ただし、商用利用や製品への組み込みを行う場合は、FFmpeg本体や組み込まれているライブラリのライセンス条件を事前に確認してください。
Q. FFmpegにGUI(画面操作)はありますか?
A. FFmpeg本体はコマンドラインで操作するツールのため、公式のGUI画面はありません。同じ処理を繰り返し行いたい場合や細かいオプションを指定したい場合はコマンド操作、直感的に操作したい場合はFFmpegを内部で利用しているGUIアプリを使うといった使い分けが可能です。
Q. 変換した動画や音声が再生できません。どうすればいいですか?
A. 出力したコンテナに対応していないコーデックを指定している可能性があります。ffprobeで入力ファイルのコーデックを確認したうえで、-c:vや-c:aオプションで対応コーデックを明示的に指定してみてください。
Q. Windows・Mac・Linuxでコマンドの書き方は変わりますか?
A. ffmpegコマンド自体の書き方はOSが変わっても共通です。異なるのはインストール方法(winget・Homebrew・aptなど)と、ターミナルアプリの種類だけなので、一度覚えたコマンドはOSを問わず利用できます。
まとめ
FFmpegをより効果的に使用するためには、コーデックや出力方法の違いなどについても理解することが重要です。
コマンド操作にあまり慣れていないという方は、まず基本的なコマンド構造を理解し、使い慣れた頃にコーデックなどの仕様について学んでいくといいでしょう。
基本操作に慣れてきたら、本記事で紹介したフィルターを組み合わせることで、さらに幅広い加工ができるようになります。
より詳しいオプションを知りたい場合は、FFmpeg公式ドキュメントも合わせて確認してみてください。