ffmpeg for macOS:インストールから動画・音声処理の基本まで
macOSユーザーにとって、動画や音声の処理は日常的な作業の一部となることがあります。フォーマット変換、解像度変更、複数のクリップの結合、音声の抽出など、様々なニーズに対応できる強力なツールがあれば、作業効率は飛躍的に向上します。そこで本記事では、オープンソースの動画・音声処理ツールである「ffmpeg」をmacOSにインストールし、その基本的な使い方を習得するための詳細なガイドを提供します。ffmpegはコマンドラインベースのツールですが、その柔軟性と高性能さから、プロフェッショナルから趣味で動画編集を行う方まで、多くのユーザーに愛用されています。
この記事では、ffmpegのインストール方法として最も推奨されるHomebrewを使った方法を中心に解説し、次にffmpegコマンドの基本構造と概念を理解します。そして、動画と音声それぞれの基本的な処理タスクについて、具体的なコマンド例とともに詳しく説明していきます。コマンドラインツールに慣れていない方でも理解できるよう、丁寧な解説を心がけます。さあ、ffmpegの強力な世界へ飛び込みましょう。
1. はじめに:ffmpegとは何か、なぜmacOSで使うのか
1.1 ffmpegとは?
ffmpegは、動画、音声、その他のマルチメディアファイルの処理を行うためのオープンソースプロジェクトであり、その中核をなすコマンドラインツールもまた「ffmpeg」という名前です。これは、動画や音声のエンコード(圧縮)、デコード(解凍)、トランスコード(変換)、フィルタリング、多重化(muxing)、分離(demuxing)、ストリーミングなど、ありとあらゆるマルチメディア処理を可能にする、非常に強力で多機能なツール群です。
ffmpegは、以下の主要なコンポーネントで構成されています。
- ffmpeg: コマンドラインから動画や音声の変換を行うツール。本記事の主役です。
- ffplay: シンプルなメディアプレイヤー。デコードやフィルタリングのテストに便利です。
- ffprobe: マルチメディアファイルの情報を解析するツール。コーデック、解像度、フレームレート、ビットレートなどの詳細を確認できます。
これらのツールは、libavcodec(各種コーデックライブラリ)、libavformat(各種コンテナフォーマットライブラリ)、libavutil(ユーティリティライブラリ)、libavfilter(フィルタリングライブラリ)、libswscale(画像スケーリングライブラリ)、libswresample(音声リサンプリングライブラリ)といったライブラリ群の上に構築されています。これにより、ffmpegは膨大な数のコーデック(H.264, H.265, VP9, AV1, AAC, MP3, Opusなど)やコンテナフォーマット(MP4, MKV, WebM, MOV, AVI, MP3, AAC, WAVなど)に対応しています。
その歴史は古く、開発が活発に続けられているため、最新のフォーマットや技術にも迅速に対応しています。多くのメディア処理ソフトウェアやサービスが、内部的にffmpegのライブラリを利用しています。例えば、VLC Media PlayerやMPlayerといったメディアプレイヤー、YouTubeやニコニコ動画といった動画共有サービス、さらにはAdobe Premiere Proのようなプロフェッショナルな編集ソフトの一部機能でもffmpegの技術が使われています。
1.2 なぜmacOSでffmpegを使うのか?
macOSはUNIXベースのオペレーティングシステムであり、Linuxなどと同様にコマンドラインツールの利用が比較的容易です。ffmpegはまさにコマンドラインベースのツールであるため、macOSとの相性が良いと言えます。
macOSでffmpegを使う主なメリットは以下の通りです。
- 高度なカスタマイズ性: GUIアプリケーションでは難しい、細かなエンコード設定や特殊な処理(例: 特定のフレーム範囲のみ処理、複数のフィルターを組み合わせる)がコマンドラインで自由に行えます。
- 自動化とバッチ処理: 複数のファイルに対して同じ処理をまとめて行いたい場合、シェルスクリプトなどと組み合わせて簡単に自動化できます。大量の動画や音声ファイルを扱う場合に非常に効率的です。
- 処理速度: GUIアプリケーションの中には、ffmpegのラッパーとして機能するものも多いですが、ffmpegを直接使用することで、余計なオーバーヘッドがなく、最速で処理を実行できる場合があります。特に、対応するハードウェアエンコーディング(VideoToolboxなど)を利用する場合、ffmpegの特定オプションで制御できるため高速化が期待できます。
- 最新機能へのアクセス: ffmpegの新しいバージョンや機能は、GUIツールよりも早くコマンドラインインターフェースとして提供されることが多いです。最新のコーデックやフィルタリング機能をすぐに試すことができます。
- 様々な用途への対応: 動画編集、音声編集、ライブストリーミング、画面録画、メディア情報の解析など、ffmpeg一つで多岐にわたるタスクに対応できます。
もちろん、macOSにはiMovieやFinal Cut Proといった優れたGUIベースの動画編集ソフトが存在します。しかし、繰り返し行う単純作業や、GUIでは実現が難しい特殊な変換・処理には、ffmpegのようなコマンドラインツールが非常に適しています。両者を使い分けることで、より効率的で柔軟なメディア処理環境を構築できます。
1.3 記事の目的と対象読者
本記事は、macOS上でffmpegをインストールし、基本的な動画および音声処理を行う方法を学ぶことを目的としています。コマンドラインツールの使用経験が少ない方でも理解できるよう、インストール手順から基本的なコマンドの構造、よく使うオプション、具体的な処理タスクの実行方法まで、ステップバイステップで丁寧に解説します。
対象読者は、以下のような方々です。
- macOSユーザーで、動画や音声のファイル形式変換、編集、加工を行いたいと考えている方。
- ffmpegの名前は知っているが、インストール方法や使い方が分からない方。
- GUIツールでは対応できない、より高度なメディア処理に挑戦したい方。
- 繰り返し行うメディア処理作業を自動化したいと考えている方。
本記事を通して、ffmpegの強力さを実感し、macOS上でのメディア処理の幅を広げていただければ幸いです。
2. ffmpegのインストール方法 (macOS)
macOSにffmpegをインストールする最も簡単で推奨される方法は、パッケージマネージャーであるHomebrewを使用することです。Homebrewは、macOSでソフトウェアを簡単にインストール・管理できるツールで、多くの開発者やコマンドラインユーザーに利用されています。
2.1 Homebrewとは?なぜHomebrewを使うのか?
Homebrewは、macOSユーザー向けの「The missing package manager for macOS」です。ソフトウェアのインストール、アップデート、アンインストールといった管理をコマンド一行で行うことができます。Homebrewを使うことで、以下のようなメリットがあります。
- 簡単なインストール: 多くのソフトウェアが
brew install <ソフトウェア名>
というコマンドでインストールできます。依存関係も自動で解決してくれます。 - 簡単なアップデート: インストール済みのソフトウェアをまとめて最新の状態に保つのが簡単です (
brew upgrade
)。 - 簡単なアンインストール: 不要になったソフトウェアも簡単に削除できます (
brew uninstall <ソフトウェア名>
)。 - システムのクリーンさ: デフォルトで
/usr/local
以下にインストールされるため、システム標準のファイルと混ざらず、環境をきれいに保てます。 - 依存関係の自動解決: ソフトウェアが必要とする他のライブラリなども自動でインストールしてくれます。ffmpegのような複雑なソフトウェアには多くの依存ライブラリが必要ですが、Homebrewを使えばそれらを意識せずにインストールできます。
これらの理由から、macOSにffmpegをインストールする際は、Homebrewを利用することを強く推奨します。
2.2 Homebrewのインストール
まだmacOSにHomebrewがインストールされていない場合は、以下の手順でインストールしてください。既にインストール済みの場合は、次の「ffmpegのインストール」に進んでください。
- ターミナルを開く: Spotlight検索(Command + Space)で「ターミナル」と入力して起動するか、「アプリケーション」->「ユーティリティ」フォルダから「ターミナル.app」を起動します。
-
インストールコマンドを実行: ターミナルに以下のコマンドを貼り付けて実行します。このコマンドはHomebrew公式サイトに掲載されているものです。
bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"curl -fsSL ...
部分は、Homebrewのインストールスクリプトをインターネットからダウンロードしています。/bin/bash -c "..."
部分は、ダウンロードしたスクリプトをbashシェルで実行しています。
-
インストールを進める: コマンドを実行すると、インストールされる内容の確認と、パスワードの入力を求められる場合があります。画面の指示に従って進めてください。インストールには数分かかることがあります。
- 環境変数の設定(必要な場合): インストール完了後、ターミナルにHomebrewの実行ファイルパス(例:
/opt/homebrew/bin
や/usr/local/bin
)をPATH環境変数に追加するよう指示が表示されることがあります。指示されたコマンド(例:echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrc
)を実行してください。これにより、どのディレクトリからでもbrew
コマンドを実行できるようになります。macOS Catalina以降のデフォルトシェルはzshなので、~/.zshrc
に設定を追加します。それ以前のbashシェルの場合は~/.bash_profile
や~/.bashrc
に追加します。 -
設定の反映: 環境変数を設定した場合、設定ファイルを読み込み直すか、ターミナルを再起動してください。
source ~/.zshrc
のようなコマンドで読み込み直せます。bash
source ~/.zshrc # または使用しているシェルの設定ファイル -
Homebrewの動作確認: ターミナルで以下のコマンドを実行し、バージョン情報が表示されればインストール成功です。
bash
brew --version
これでHomebrewのインストールは完了です。
2.3 ffmpegのインストール (Homebrew)
Homebrewがインストールできたら、ffmpegのインストールは非常に簡単です。
-
ffmpegのインストールコマンドを実行: ターミナルで以下のコマンドを実行します。
bash
brew install ffmpegこのコマンドを実行すると、Homebrewはffmpeg本体だけでなく、ffmpegが必要とする様々な依存ライブラリ(例: libx264, libmp3lame, libvorbis, libopus, libvpx, libtheoraなど)も自動でダウンロードしてコンパイル・インストールしてくれます。このプロセスには、インターネット接続速度やMacの性能にもよりますが、10分〜30分以上かかることがあります。
-
インストール時のオプション (任意)
デフォルトの
brew install ffmpeg
では、一般的なユースケースで十分な機能が利用できます。しかし、特定のコーデックや機能(例: NVIDIA/Intel/Apple Siliconのハードウェアアクセラレーション、特定のライブラリ)が必要な場合は、オプションを指定してインストールすることも可能です。利用可能なオプションを確認するには、以下のコマンドを実行します。
bash
brew info ffmpeg表示される情報の中に、「Dependencies」(依存ライブラリ)や「Options」(インストール時に指定できるオプション)の項目があります。例えば、ハードウェアエンコーディングを有効にするオプションや、より多くのサードパーティ製ライブラリを有効にするオプションなどが見つかるかもしれません。
例として、よく使われるサードパーティ製ライブラリ(fdk-aac: 高品質AACエンコーダー, libvmaf: VMAF品質評価ライブラリなど)を有効にしてインストールしたい場合は、以下のようにオプションを指定します(オプション名は
brew info ffmpeg
で確認してください)。bash
brew install ffmpeg --with-fdk-aac --with-libvmaf # オプション名は例です。最新はbrew infoで確認してください。注意: オプションを指定すると、インストール時間が増加する場合があります。また、特定のライブラリは利用規約が異なる場合(非GPL互換など)があります。特に理由がなければ、最初はオプションなしでのインストールを推奨します。
-
インストール後の確認: ffmpegのインストールが完了したら、以下のコマンドを実行して、ffmpeg、ffprobe、ffplayが正しくインストールされ、パスが通っているか確認します。
bash
ffmpeg -version
ffprobe -version
ffplay -version # ffplayはオプションなしでインストールした場合含まれないことがあります。それぞれのバージョン情報やコンパイルオプション(どのライブラリが有効になっているか)が表示されれば成功です。表示されない場合やエラーになる場合は、環境変数PATHの設定が正しくないか、インストールが失敗している可能性があります。
2.4 インストール後のトラブルシューティング
command not found: ffmpeg
:- Homebrewのインストール時に表示されたPATH環境変数の設定指示を再度確認し、設定が
.zshrc
(または使用シェルに応じて.bash_profile
など) に追記されているか確認してください。 - 設定ファイルを編集した場合は、
source ~/.zshrc
などで読み込み直すか、ターミナルを再起動してください。 - Homebrewがインストールされているか (
brew --version
)、ffmpegが正しくインストールされているか (brew list ffmpeg
) を確認してください。
- Homebrewのインストール時に表示されたPATH環境変数の設定指示を再度確認し、設定が
- インストール中にエラーが発生する:
- インターネット接続が安定しているか確認してください。
brew update
でHomebrew自体を最新の状態にしてから再度インストールを試みてください。- エラーメッセージをよく読み、HomebrewのGitHubリポジトリのIssueやフォーラムなどで同様の事例がないか検索してみてください。依存ライブラリのコンパイルエラーなどが考えられます。
brew doctor
コマンドを実行し、Homebrew環境に問題がないか確認してください。指示に従って問題を修正してください。- ディスク容量が不足していないか確認してください。
- 特定のコーデックが利用できない:
ffmpeg -version
またはffmpeg -codecs
コマンドを実行し、利用したいコーデックがコンパイルオプションに含まれているか確認してください。--enable-libx265
のように表示されているか、デコーダー(D)やエンコーダー(E)としてリストされているかを確認します。- 含まれていない場合は、そのコーデックを有効にするオプションを指定してffmpegを再インストールする必要があります (
brew reinstall ffmpeg --with-xxx
)。
2.5 手動でのコンパイル (上級者向け)
Homebrewを使わず、ソースコードから手動でffmpegをコンパイルすることも可能です。この方法は、非常に新しい開発版の機能を使いたい場合や、Homebrewでは提供されていない特定のライブラリやコンパイルオプションが必要な場合に選択されます。
手順の概要は以下の通りです。
- 開発ツールのインストール: XcodeとCommand Line Toolsをインストールします。
- 依存ライブラリのインストール: ffmpegが必要とする様々なライブラリ(例: libx264, libvo-aacenc, fdk-aacなど)を、ソースコードからコンパイルするか、MacPortsなどの別のパッケージマネージャーを使ってインストールします。これが最も手間のかかる部分です。
- ffmpegソースコードのダウンロード: ffmpegの公式サイトから最新のソースコードをダウンロードします。Gitを使ってリポジトリをクローンすることもできます。
- configureスクリプトの実行: ターミナルでダウンロードしたディレクトリに移動し、
./configure
スクリプトを実行します。この際に、有効にしたいライブラリや機能を--enable-xxx
オプションで指定します。依存ライブラリへのパスを指定する必要がある場合もあります。 - コンパイルとインストール:
make
コマンドでコンパイルし、make install
コマンドでシステムにインストールします。
手動コンパイルは、依存関係の解決やコンフィグレーションオプションの指定など、多くの知識と手間が必要です。特別な理由がない限り、Homebrewを使ったインストールを強く推奨します。
これでmacOSへのffmpegのインストールは完了です。次はいよいよ、ffmpegを使った基本的な処理方法を学んでいきましょう。
3. ffmpegの基本概念とコマンド構造
ffmpegはコマンドラインツールです。複雑な機能もすべてコマンドとオプションの組み合わせで実現します。ここでは、ffmpegコマンドの基本的な構造と、処理の際に重要となる概念について解説します。
3.1 コマンドラインインターフェース (CLI) の基本
ffmpegはターミナルからコマンドを入力して実行します。コマンドは基本的に以下の形式をとります。
bash
command [options] arguments
ffmpegの場合は以下のようになります。
bash
ffmpeg [global options] {[input file options] -i input_url} ... {[output file options] output_url} ...
ffmpeg
: 実行するコマンド名です。[global options]
: 全体的な動作に影響を与えるオプションです。入力や出力に依存しません。{[input file options] -i input_url} ...
: 入力ファイルとそのファイルに適用するオプションを指定します。-i
は入力ファイルを指定するオプションで、複数指定することも可能です。{[output file options] output_url} ...
: 出力ファイルとそのファイルに適用するオプションを指定します。出力ファイルも複数指定できます。
入力オプションは対応する -i
の直前に、出力オプションは対応する出力ファイル名の直前に記述するのが基本的なルールです。
3.2 主要なオプションの種類
ffmpegのオプションは非常に多岐にわたりますが、ここでは特によく使う重要なオプションの種類を紹介します。
-
グローバルオプション:
-y
: 出力ファイルを上書き確認なしで強制的に上書きします。自動化スクリプトなどで便利です。-n
: 出力ファイルが既に存在する場合、上書きせずに終了します。-loglevel level
: ログの表示レベルを指定します。quiet
(何も表示しない),panic
,fatal
,error
,warning
,info
,verbose
,debug
などがあります。デフォルトはinfo
です。-hide_banner
: 起動時に表示されるffmpegのバージョン情報やコンフィグレーション情報のバナー表示を suppresses します。-ss position
(入力オプションとしても使用): 処理を開始する位置を指定します。hh:mm:ss
形式または秒数で指定します。入力ファイルの-i
オプションの前に置くと、入力ファイルのシーク処理が行われ、高速に指定時刻から処理を開始できます(キーフレーム単位でシークされるため、正確な時刻からではないことがあります)。-i
の後に置くと、入力ストリームをデコードしながらシークするため時間はかかりますが、より正確な時刻から処理を開始できます。-t duration
(入力/出力オプションとして使用): 処理する期間を指定します。入力オプションとして-i
の前に置くと、その入力ファイルの duration を指定できます。出力オプションとして出力ファイルの前に置くと、出力ファイルの duration を指定できます。hh:mm:ss
形式または秒数で指定します。
-
入力オプション:
-i input_url
: 入力ファイルを指定します。必須のオプションです。-ss position
: 上述の通り、入力ファイルの開始位置を指定します。-t duration
: 上述の通り、入力ファイルの期間を指定します。-f format
: 入力フォーマットを強制的に指定します。通常はffmpegが自動で判別しますが、必要な場合に指定します。
-
出力オプション:
output_url
: 出力ファイル名を指定します。ファイル名の拡張子から自動でコンテナフォーマットを決定します。-f format
: 出力フォーマットを強制的に指定します。-c[:stream_specifier] codec
: コーデックを指定します。-c:v codec
: 動画コーデックを指定します(例:-c:v libx264
)。-c:a codec
: 音声コーデックを指定します(例:-c:a aac
)。-c:s codec
: 字幕コーデックを指定します。-c copy
: エンコードせずに、入力ストリームをそのまま出力ファイルにコピーします。処理が非常に高速ですが、フォーマットやコーデックを変更することはできません。
-b[:stream_specifier] bitrate
: ビットレートを指定します。-b:v bitrate
: 動画ビットレートを指定します(例:-b:v 2M
または-b:v 2000k
)。-b:a bitrate
: 音声ビットレートを指定します(例:-b:a 192k
)。
-r rate
: フレームレートを指定します(例:-r 30
)。-s size
: 解像度を指定します(例:-s 1280x720
)。-aspect aspect
: アスペクト比を指定します(例:-aspect 16:9
)。-vn
: 動画ストリームを無効にします(音声のみ出力)。-an
: 音声ストリームを無効にします(動画のみ出力)。-sn
: 字幕ストリームを無効にします。-map [:stream_specifier]
: 入力ファイルからどのストリームを出力に含めるかを指定します。-map 0
: 最初の入力ファイルの全てのストリームを含めます。-map 0:v:0
: 最初の入力ファイルの最初の動画ストリームを含めます。-map 0:a:1
: 最初の入力ファイルの2番目の音声ストリームを含めます。- 複数の入力ファイルを扱う場合や、特定のストリームのみを抽出/コピーする場合に非常に重要です。
-metadata key=value
: メタデータを追加または変更します(例:-metadata title="My Video"
)。
-
フィルタオプション:
-vf filtergraph
: 動画フィルターグラフを指定します。-af filtergraph
: 音声フィルターグラフを指定します。-filter_complex filtergraph
: 複数の入力や複数の出力、あるいは複雑なストリーム間の操作を含むフィルターグラフを指定します。動画と音声の合成、複数の動画の結合などに使われます。
3.3 ストリーム指定 (-map
および :
)
マルチメディアファイルは、動画ストリーム、音声ストリーム、字幕ストリーム、データストリームなど、複数のストリームを含むことがあります。ffmpegはこれらのストリームをインデックスで管理します。
- 入力ファイルは0から始まるインデックスが割り当てられます(最初の
-i
が0、次が1、…)。 - 各入力ファイル内のストリームも、種類ごとに0から始まるインデックスが割り当てられます(例: 動画ストリーム 0, 1, …、音声ストリーム 0, 1, …)。
ストリームを指定する際の記法は以下のようになります。
input_index:stream_type:stream_index
: 例:0:v:0
(最初の入力ファイルの最初の動画ストリーム)input_index
: 入力ファイルのインデックス (0, 1, …)stream_type
: ストリームの種類 (v
for video,a
for audio,s
for subtitle,d
for data)stream_index
: その種類の中でのストリームのインデックス (0, 1, …)
-map
オプションを使うと、どの入力ストリームをどの出力にマップするかを細かく制御できます。これは、複数の入力ファイルを扱う場合や、特定のストリームだけを抽出・コピーしたい場合に不可欠です。
例:
-map 0:v:0
: 最初の入力ファイルの最初の動画ストリームのみをマップ-map 0:a:0
: 最初の入力ファイルの最初の音声ストリームのみをマップ-map 0:v:0 -map 1:a:0
: 最初の入力ファイルの動画と、2番目の入力ファイルの音声を組み合わせる
3.4 フィルターグラフ (-vf
, -af
, -filter_complex
)
ffmpegの強力な機能の一つに、フィルターグラフがあります。これにより、動画や音声ストリームに対して様々な処理を適用できます。
-vf filtergraph
: 単一の入力ストリームに対する動画フィルターを適用します。例:-vf scale=1280:720
-af filtergraph
: 単一の入力ストリームに対する音声フィルターを適用します。例:-af volume=2.0
-filter_complex filtergraph
: 複数の入力ストリームを扱う場合や、フィルター間でストリームを複雑に接続する必要がある場合に使用します。例えば、ピクチャー・イン・ピクチャー効果、複数の動画の結合、動画と音声の複雑なミキシングなどに使われます。フィルターグラフは入力と出力にラベル(例:[0:v]
,[outv]
)を付けて、フィルターを[in]filter=options[out]
の形式でチェーンのように繋げて表現します。
フィルターグラフは非常に強力ですが、その記述方法はやや複雑です。基本的な単一ストリームの処理には -vf
や -af
が手軽です。
これらの基本概念を理解しておけば、ffmpegのコマンドを組み立てやすくなります。最初は難しく感じるかもしれませんが、具体的な使用例を通して慣れていくことが重要です。
4. 基本的な動画処理
ここでは、ffmpegを使って行う基本的な動画処理タスクについて、具体的なコマンド例とともに解説します。
4.1 動画フォーマットの変換 (Format Conversion)
最も一般的なffmpegの用途の一つが、動画ファイルのフォーマット変換です。コンテナフォーマット(MP4, WebM, MKVなど)や、内部の動画・音声コーデックを変更できます。
例: MP4 (H.264, AAC) を WebM (VP9, Opus) に変換する
bash
ffmpeg -i input.mp4 output.webm
このコマンドを実行すると、ffmpegは input.mp4
を読み込み、最適なデフォルト設定でWebMコンテナ、VP9動画コーデック、Opus音声コーデックを使って output.webm
を生成します。
明示的にコーデックを指定することもできます。
例: MP4 (H.264) を MP4 (H.265/HEVC) に変換する
bash
ffmpeg -i input.mp4 -c:v libx265 -c:a copy output.mp4
-c:v libx265
: 動画コーデックとしてlibx265(H.265/HEVCエンコーダー)を指定します。-c:a copy
: 音声ストリームはエンコードせず、そのままコピーします。音声の品質劣化を防ぎ、処理時間を短縮できます。出力フォーマット(MP4)が入力音声コーデックに対応している必要があります。
例: MKV (VP9, Opus) を MP4 (H.264, AAC) に変換する
bash
ffmpeg -i input.mkv -c:v libx264 -c:a aac -strict experimental output.mp4
-c:v libx264
: 動画コーデックとしてlibx264(H.264エンコーダー)を指定します。-c:a aac
: 音声コーデックとして組み込みのAACエンコーダーを指定します。-strict experimental
: 組み込みのAACエンコーダーはまだ「experimental(実験的)」とされているため、このオプションが必要です。もしHomebrewで--with-fdk-aac
オプション付きでインストールしている場合は、より高品質な-c:a libfdk_aac
を使用できます(その場合-strict experimental
は不要です)。
4.2 解像度の変更 (Resizing)
動画の解像度を変更するには、動画フィルター(scale
フィルター)を使用します。
例: 1920×1080 の動画を 1280×720 にリサイズする
bash
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
-vf scale=1280:720
: 動画フィルターとしてscale
を適用し、幅を1280ピクセル、高さを720ピクセルに指定します。
アスペクト比を維持したままリサイズする場合、幅または高さの一方だけを指定し、もう一方を -1
にすると、自動的にアスペクト比を維持する値が計算されます。
例: 幅を640ピクセルにし、高さを自動調整する(アスペクト比維持)
bash
ffmpeg -i input.mp4 -vf scale=640:-1 output.mp4
例: 高さを480ピクセルにし、幅を自動調整する(アスペクト比維持)
bash
ffmpeg -i input.mp4 -vf scale=-1:480 output.mp4
また、入力動画のサイズを基準に相対的なサイズを指定することもできます。
例: 入力動画の半分の幅・高さにリサイズする
bash
ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4
iw
: 入力動画の幅 (input width)ih
: 入力動画の高さ (input height)
4.3 フレームレートの変更 (Changing Frame Rate)
動画のフレームレート(fps, Frames Per Second)を変更するには、出力オプションの -r
を使用します。
例: 60fpsの動画を30fpsに変換する
bash
ffmpeg -i input.mp4 -r 30 output.mp4
これは、入力ストリームのフレームを間引く(ドロップする)ことでフレームレートを変更します。フレームを複製してフレームレートを上げることも可能ですが、スムーズさに欠ける場合があります。フレームレートを上げる場合は、minterpolate
などの動画フィルターが必要になることもあります。
4.4 動画の切り出し (Trimming/Cutting)
動画の一部を切り出すには、-ss
(開始位置) および -to
(終了位置) または -t
(期間) オプションを使用します。
例: 10秒から20秒までの部分を切り出す (終了時刻を指定)
bash
ffmpeg -i input.mp4 -ss 00:00:10 -to 00:00:20 -c copy output.mp4
例: 10秒から10秒間(つまり10秒から20秒まで)の部分を切り出す (期間を指定)
bash
ffmpeg -i input.mp4 -ss 00:00:10 -t 10 -c copy output.mp4
-ss 00:00:10
: 処理を開始する時刻を開始から10秒後(0時間0分10秒)に指定します。-to 00:00:20
: 処理を終了する時刻を開始から20秒後に指定します。-t 10
:-ss
で指定した開始時刻から10秒間の期間を処理します。-c copy
: 動画ストリームも音声ストリームも、再エンコードせずにそのままコピーします。これにより、処理が非常に高速になり、品質劣化もありません。ただし、入力フォーマットと出力フォーマットが互換性があり、切り出しがキーフレームで始まる場合に正確に行えます。
高速な切り出し (-ss
を -i
の前に置く)
-ss
オプションを -i
オプションの前に置くと、ffmpegはファイルを開く前に指定された時刻にシークしようとします。これは通常、キーフレーム単位でのシークとなり、正確な開始位置ではない場合がありますが、処理が格段に高速になります。
bash
ffmpeg -ss 00:00:10 -i input.mp4 -to 00:00:20 -c copy output.mp4
正確な開始位置で切り出したい場合は、-ss
を -i
の後に置きます。
bash
ffmpeg -i input.mp4 -ss 00:00:10 -to 00:00:20 -c copy output.mp4 # デコードしながらシークするため正確だが遅い
copy
コマンドを使う場合、-ss
を -i
の前に置くと、開始時刻はキーフレーム単位になる可能性がありますが、-to
や -t
で指定した終了時刻は正確になる傾向があります。一方、-ss
を -i
の後に置くと、開始時刻は正確になりますが、-to
や -t
が指定された時刻より少し長くなる場合があります。用途に応じて使い分けてください。再エンコードする場合は -ss
の位置に関わらず開始時刻は正確になりますが、終了時刻は少し長くなる傾向があります。正確な終了時刻で切り出したい場合は、trim
フィルターなどを使用する必要があります。
4.5 動画の連結 (Concatenation)
複数の動画ファイルを一つに連結するには、いくつかの方法があります。最も簡単で高速なのは、同じコーデックとコンテナフォーマットを持つファイルを再エンコードせずに結合する方法です。
方法1: デムクサーを使った連結 (同形式のファイル)
入力ファイルのリストを記述したテキストファイルを用意し、concat
デムクサーを使用します。
- 連結したい動画ファイルを用意します(例:
intro.mp4
,part1.mp4
,part2.mp4
)。これらは動画・音声コーデック、解像度、フレームレート、音声チャンネル数などの形式がすべて一致している必要があります。 -
以下の内容のテキストファイルを作成します(例:
mylist.txt
)。file 'intro.mp4'
file 'part1.mp4'
file 'part2.mp4'ファイルパスは、ffmpegコマンドを実行する場所からの相対パスまたは絶対パスで指定します。ファイル名に特殊文字が含まれる場合は、シングルクォートで囲んでください。
-
以下のコマンドを実行します。
bash
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4-f concat
: 入力フォーマットとしてconcat
デムクサーを指定します。-safe 0
:file
ディレクティブに相対パスや特定の文字を含むパスを使用できるようにします。安全でないパスからの読み込みを許可しますが、通常は問題ありません。-i mylist.txt
: 入力ファイルとしてリストファイルmylist.txt
を指定します。-c copy
: 入力ストリームを再エンコードせずにそのままコピーして連結します。高速で劣化がありません。
方法2: フィルターグラフを使った連結 (異形式のファイル)
異なる形式の動画ファイルを連結する場合や、より複雑な連結(例: フェードイン/アウトを挟む)を行う場合は、filter_complex
オプションと concat
フィルターを使用します。この方法は再エンコードが必要になります。
例: 異なる形式の動画 input1.mp4
と input2.mov
を連結する
bash
ffmpeg -i input1.mp4 -i input2.mov -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" output.mp4
-i input1.mp4 -i input2.mov
: 2つの入力ファイルを指定します。-filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]"
: フィルターグラフを指定します。[0:v]
,[0:a]
: 最初の入力ファイル (インデックス0) の動画ストリームと音声ストリーム。[1:v]
,[1:a]
: 2番目の入力ファイル (インデックス1) の動画ストリームと音声ストリーム。- これら4つの入力ストリームを
concat
フィルターに渡します。 concat=n=2:v=1:a=1
:concat
フィルターの設定。n=2
: 連結する入力セグメントの数(ここでは2つの入力ファイルなので2)。v=1
: 出力する動画ストリームの数(1本)。a=1
: 出力する音声ストリームの数(1本)。
[outv][outa]
:concat
フィルターの出力ラベル。動画ストリームに[outv]
, 音声ストリームに[outa]
というラベルを付けます。
-map "[outv]" -map "[outa]"
: フィルターグラフで生成された[outv]
と[outa]
というラベルのストリームを、出力ファイルoutput.mp4
にマップします。- 出力ファイル形式に合わせて動画・音声が再エンコードされます。必要に応じて
-c:v
,-c:a
,-b:v
,-b:a
などのオプションを追加してエンコード設定を調整してください。
フィルターグラフを使った連結は強力ですが、入力ファイル数やストリーム構成に応じてフィルターグラフの記述が複雑になります。
4.6 サムネイル画像の生成 (Generating Thumbnails)
動画から特定の時点の静止画(サムネイル)を抽出することもできます。
例: 動画の開始から5秒後のフレームをPNG画像として保存する
bash
ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 output.png
-i input.mp4
: 入力ファイルを指定します。-ss 00:00:05
: シークを開始する時刻を5秒後に指定します。ここでも-i
の前に置くと高速ですが不正確、後に置くと正確ですが遅くなります。-vframes 1
: 出力する動画フレームの数を1に制限します。静止画を出力する場合に指定します。output.png
: 出力ファイル名を指定します。拡張子から画像フォーマット(PNG, JPGなど)が決定されます。
複数のサムネイルを、一定の間隔や時間で生成することも可能です。
例: 動画から1秒間隔で10枚のPNG画像を生成する (output-0001.png, output-0002.png, …)
bash
ffmpeg -i input.mp4 -vf fps=1 output-%04d.png
-vf fps=1
: 動画フィルターとしてfps
を適用し、1秒あたり1フレームを出力するように指定します。output-%04d.png
: 出力ファイル名のパターンを指定します。%04d
は、フレーム番号をゼロ埋め4桁で表示するという意味です。
例: 動画の再生時間全体をカバーするように、均等間隔で10枚のJPG画像を生成する
bash
ffmpeg -i input.mp4 -vframes 10 -q:v 2 output-%02d.jpg
-vframes 10
: 出力するフレーム数を10枚に指定します。ffmpegは動画の長さに応じてフレームを自動選択します。-q:v 2
: 動画の出力品質を固定品質係数(Constant Quantization Parameter)で指定します。JPG画像の場合、値が小さいほど高品質になります(通常2-31の範囲、2-5程度が良い品質)。JPGエンコーダーに適用されるオプションです。output-%02d.jpg
: 出力ファイル名のパターンを指定します。%02d
はゼロ埋め2桁です。
5. 基本的な音声処理
次に、ffmpegを使った基本的な音声処理タスクについて解説します。
5.1 音声フォーマットの変換 (Format Conversion)
音声ファイルのフォーマット(コンテナフォーマットやコーデック)を変換します。
例: MP3ファイルをAAC (.m4a) に変換する
bash
ffmpeg -i input.mp3 -c:a aac output.m4a
-i input.mp3
: 入力ファイルを指定します。-c:a aac
: 音声コーデックとしてAACを指定します(組み込みエンコーダー)。output.m4a
: 出力ファイル名を指定します。.m4a
拡張子でAACコンテナ(MP4コンテナの音声のみ版)が選択されます。
高品質なAACエンコーダーである libfdk_aac
が利用可能な場合(Homebrewで --with-fdk-aac
付きでインストールした場合)、こちらを使用できます。
例: MP3をlibfdk_aacエンコーダーでAAC (.m4a) に変換する
bash
ffmpeg -i input.mp3 -c:a libfdk_aac -vbr 4 output.m4a
-c:a libfdk_aac
: 音声コーデックとしてlibfdk_aacを指定します。-vbr 4
: 可変ビットレート(VBR)モードを指定します。vbr
オプションはlibfdk_aac独自のものです。値が大きいほど高品質になります(通常1-5)。
例: WAV (PCM) ファイルをOpus (.opus) に変換する
bash
ffmpeg -i input.wav -c:a libopus -b:a 128k output.opus
-c:a libopus
: 音声コーデックとしてlibopusを指定します。-b:a 128k
: 音声ビットレートを128 kbpsに指定します。Opusは低ビットレートでも高品質なことで知られています。
5.2 ビットレートの変更 (Changing Bitrate)
音声のビットレートを変更するには、-b:a
オプションを使用します。通常、ビットレートを下げるとファイルサイズは小さくなりますが、音質は劣化します。
例: 音声ビットレートを128 kbpsに下げる(元の動画に適用)
bash
ffmpeg -i input.mp4 -c:v copy -c:a aac -b:a 128k output.mp4
-c:v copy
: 動画ストリームはエンコードせずコピーします。-c:a aac
: 音声ストリームをAACで再エンコードします。-b:a 128k
: 音声ビットレートを128 kbpsに指定します。
コーデックによっては、-b:a
ではなく可変ビットレート(VBR)や固定品質(CBR)に関する別のオプション(例: libfdk_aacの -vbr
, libmp3lameの -q:a
や -V
など)を使う方が推奨される場合があります。詳細は各コーデックのドキュメントを参照してください。
5.3 音量の変更 (Changing Volume)
音声の音量を調整するには、音声フィルター(volume
フィルター)を使用します。
例: 音量を2倍にする (ゲインを+6dBにする)
bash
ffmpeg -i input.mp4 -af "volume=2.0" output.mp4
-af "volume=2.0"
: 音声フィルターとしてvolume
を適用し、音量を元の2.0倍にします。volume=X.Y
: X.Y倍(リニア)で指定します。volume=XdB
: Xデシベルで指定します。例:volume=6dB
(約2倍),volume=-6dB
(約0.5倍)
音量を変更すると音声が再エンコードされます。
5.4 音声の抽出 (Extracting Audio)
動画ファイルから音声ストリームだけを抽出して、独立した音声ファイルとして保存できます。
例: MP4動画からAAC音声ストリームを抽出する
bash
ffmpeg -i input.mp4 -vn -acodec copy output.aac
-i input.mp4
: 入力ファイルを指定します。-vn
: 動画ストリームを無効にします(出力に含めない)。-acodec copy
: 音声コーデックをcopy
に指定します。これにより、音声ストリームを再エンコードせずにそのまま出力ファイルにコピーします。output.aac
: 出力ファイル名を指定します。拡張子からコンテナフォーマット(AAC raw stream)が決定されます。
元の音声コーデックがMP3であれば .mp3
、Opusであれば .opus
など、対応する拡張子を指定することで、そのコーデックの音声ファイルを抽出できます。
複数の音声ストリームがある動画から特定の音声ストリームを抽出したい場合は、-map
オプションを使用します。
例: 入力ファイルの2番目の音声ストリーム(インデックス1)を抽出する
bash
ffmpeg -i input.mp4 -map 0:a:1 -vn -acodec copy output.aac
-map 0:a:1
: 最初の入力ファイル (0) の、音声ストリーム (a
) の2番目 (1) をマップします。
5.5 音声の挿入/置き換え (Inserting/Replacing Audio)
動画ファイルに別の音声ファイルを挿入したり、既存の音声を置き換えたりすることができます。これは複数の入力ファイルを扱い、-map
オプションで出力に含めるストリームを選択することで実現します。
例: video.mp4
(動画のみ) と audio.mp3
(音声のみ) を結合して新しい動画ファイルを作成する
bash
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4
-i video.mp4
: 最初の入力ファイルとして動画ファイルを指定します(インデックス0)。-i audio.mp3
: 2番目の入力ファイルとして音声ファイルを指定します(インデックス1)。-c:v copy
: 動画ストリームは再エンコードせずにコピーします。-c:a aac
: 音声ストリームはAACに再エンコードします(必要に応じて他のコーデックや-c:a copy
も選択肢に入りますが、入力音声がMP3で出力がMP4の場合、AACに変換するのが一般的です)。-map 0:v:0
: 最初の入力ファイル(video.mp4)の最初の動画ストリーム (0:v:0
) を出力にマップします。-map 1:a:0
: 2番目の入力ファイル(audio.mp3)の最初の音声ストリーム (1:a:0
) を出力にマップします。output.mp4
: 出力ファイル名を指定します。
例: input.mp4
の既存の音声を、new_audio.aac
の音声に置き換える
bash
ffmpeg -i input.mp4 -i new_audio.aac -c:v copy -c:a copy -map 0:v:0 -map 1:a:0 output_with_new_audio.mp4
この例では、入力ファイルの動画ストリーム (0:v:0
) と新しい音声ファイルの音声ストリーム (1:a:0
) をコピーして結合しています。入力音声は出力に含まれません。
5.6 チャンネル数の変更 (Changing Channel Count)
音声のチャンネル数(モノラル、ステレオなど)を変更するには、音声フィルター(acodec
や channelsplit
, amerge
, pan
など)または -ac
オプションを使用します。
例: ステレオ音声をモノラルに変換する
bash
ffmpeg -i input.mp4 -ac 1 output.mp4
-ac 1
: 出力音声のチャンネル数を1(モノラル)に指定します。ffmpegは自動的にステレオチャンネルをミックスしてモノラルを作成します。
例: モノラル音声をステレオに変換する (左右同じ音声)
bash
ffmpeg -i input.mp4 -ac 2 output.mp4
-ac 2
: 出力音声のチャンネル数を2(ステレオ)に指定します。ffmpegはモノラル音声を左右両方のチャンネルに複製します。
より複雑なチャンネル操作(特定のチャンネルだけを残す、パンニングなど)には channelsplit
, amerge
, pan
といった音声フィルターを使用する必要があります。
6. 動画と音声の複合処理
ffmpegの真価は、動画と音声のストリームを同時に、あるいは相互作用させながら処理できる点にあります。ここでは、いくつかの複合的な処理例を紹介します。
6.1 エンコード設定の組み合わせ
前のセクションで紹介した動画と音声のオプションを組み合わせて、一度に複数の処理を行うことができます。
例: 動画を720pにリサイズし、音声ビットレートを128kに変更して、MP4として出力する
bash
ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -preset medium -c:a aac -b:a 128k output.mp4
-vf scale=1280:720
: 動画をリサイズします。-c:v libx264 -preset medium
: 動画をH.264でエンコードし、エンコード速度と圧縮率のバランスが良いmedium
プリセットを使用します。-c:a aac -b:a 128k
: 音声をAACでエンコードし、ビットレートを128kbpsに指定します。
このように、-vf
, -af
, -c:v
, -c:a
, -b:v
, -b:a
などのオプションを一つのコマンドで組み合わせることができます。
6.2 字幕の追加 (Adding Subtitles)
動画に字幕を追加する方法は、主に「ハードサブ」(動画フレームに直接焼き付ける)と「ソフトサブ」(動画・音声とは別のストリームとして追加し、プレイヤー側で表示/非表示を切り替えられる)の2種類があります。
方法1: ハードサブ (動画に焼き付け)
subtitles
または ass
動画フィルターを使用します。これにより動画が再エンコードされます。
例: ASS/SSA形式の字幕ファイル subtitle.ass
を動画に焼き付ける
bash
ffmpeg -i input.mp4 -vf "ass=subtitle.ass" -c:a copy output_hardsub.mp4
-vf "ass=subtitle.ass"
: 動画フィルターとしてass
を適用し、字幕ファイルsubtitle.ass
を読み込みます。フィルター名はsubtitles
でも多くの形式に対応しますが、ASS/SSA形式にはass
フィルターが推奨されます。-c:a copy
: 音声はコピーします。動画は字幕焼き付けのために再エンコードされます。
SRT形式の字幕ファイルを使用する場合:
bash
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" -c:a copy output_hardsub.mp4
方法2: ソフトサブ (ストリームとして追加)
入力ファイルとして動画と字幕ファイルを指定し、-map
オプションで出力に含めるストリームを制御します。動画と音声はコピーし、字幕ストリームをmuxing(多重化)します。
例: SRT形式の字幕ファイル subtitle.srt
を動画にソフトサブとして追加する
bash
ffmpeg -i input.mp4 -i subtitle.srt -c copy -map 0 -map 1:s:0 output_softsub.mp4
-i input.mp4
: 最初の入力ファイルとして動画を指定します(インデックス0)。-i subtitle.srt
: 2番目の入力ファイルとして字幕ファイルを指定します(インデックス1)。-c copy
: 動画、音声、字幕の全てのストリームを可能な限りコピーします(互換性があれば)。-map 0
: 最初の入力ファイル(input.mp4)の全てのストリーム(動画、音声など)をマップします。-map 1:s:0
: 2番目の入力ファイル(subtitle.srt)の最初の字幕ストリーム (1:s:0
) を出力にマップします。
この方法では再エンコードが行われないため高速ですが、出力コンテナフォーマット(この例ではMP4)が追加する字幕フォーマットをサポートしている必要があります。MP4はTimed Text (mov_text) 形式の字幕をサポートしており、srt形式は多くの場合自動的に変換されます。MKVコンテナはより多くの字幕形式をサポートします。
6.3 透かし/ロゴの追加 (Adding Watermarks/Logos)
動画に静止画(ロゴなど)を透かしとして重ねるには、overlay
動画フィルターを使用します。これは filter_complex
で記述するのが一般的です。
例: logo.png
ファイルを動画 input.mp4
の右下隅に透かしとして重ねる
bash
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=W-w-10:H-h-10" -c:a copy output_watermark.mp4
-i input.mp4
: 最初の入力ファイル(動画、インデックス0)。-i logo.png
: 2番目の入力ファイル(ロゴ画像、インデックス1)。-filter_complex "overlay=W-w-10:H-h-10"
: フィルターグラフを指定します。- デフォルトでは、
overlay
フィルターは最初の入力(動画)を背景、2番目の入力(ロゴ画像)を重ねる画像として扱います。 overlay=x:y
: 重ねる画像の左上隅の座標を指定します。W
: 背景動画の幅。H
: 背景動画の高さ。w
: 重ねる画像の幅。h
: 重ねる画像の高さ。
W-w-10
: x座標を背景動画の幅からロゴ画像の幅を引き、さらに10ピクセル左にずらします(右端から10ピクセルの位置)。H-h-10
: y座標を背景動画の高さからロゴ画像の高さを引き、さらに10ピクセル上にずらします(下端から10ピクセルの位置)。
- デフォルトでは、
-c:a copy
: 音声はコピーします。動画はオーバーレイのために再エンコードされます。
ロゴ画像を透過PNGにすると、透過情報を維持して重ねられます。
6.4 フィルターグラフの活用例
filter_complex
は非常に強力で、複数のフィルターを組み合わせて複雑な処理を行うことができます。
例: 動画を720pにリサイズし、同時に音声の音量を2倍にする
bash
ffmpeg -i input.mp4 -filter_complex "[0:v]scale=1280:720[outv];[0:a]volume=2.0[outa]" -map "[outv]" -map "[outa]" output.mp4
-filter_complex "..."
: フィルターグラフの開始。複数のフィルターをセミコロン;
で区切って記述します。[0:v]scale=1280:720[outv]
: 最初の入力の動画ストリーム ([0:v]
) に対してscale
フィルターを適用し、結果に[outv]
というラベルを付けます。[0:a]volume=2.0[outa]
: 最初の入力の音声ストリーム ([0:a]
) に対してvolume
フィルターを適用し、結果に[outa]
というラベルを付けます。
-map "[outv]" -map "[outa]"
: フィルターグラフで生成された動画ストリーム ([outv]
) と音声ストリーム ([outa]
) を出力ファイルにマップします。
このように、filter_complex
を使うことで、複数のストリームに対して独立した処理を適用したり、ストリームを結合・分割したり、フィルターの出力を別のフィルターの入力にしたりといった高度な操作が可能になります。
7. パフォーマンスと最適化
ffmpegのエンコード処理はCPUリソースを大量に消費する場合があります。特に高解像度や高フレームレート、高品質なエンコーダーを使用する場合、処理に長い時間がかかることがあります。ここではパフォーマンスに関連するいくつかの要素と最適化のヒントを紹介します。
-
エンコード速度と品質のバランス:
- 動画エンコーダー(libx264, libx265など)には、エンコード速度と圧縮効率・品質のトレードオフを調整する「プリセット」オプションがあります。例えば、libx264やlibx265の
-preset
オプションにはultrafast
,superfast
,fast
,medium
(デフォルト),slow
,slower
,veryslow
,placebo
などがあります。ultrafast
は最速ですが圧縮効率が悪くファイルサイズが大きくなりがち、veryslow
やplacebo
は低速ですが最高の圧縮効率と品質が得られます。用途に応じて適切なプリセットを選択することで、時間の節約と品質のバランスを取ることができます。 - 例:
-c:v libx264 -preset slow input.mp4 output.mp4
- 動画エンコーダー(libx264, libx265など)には、エンコード速度と圧縮効率・品質のトレードオフを調整する「プリセット」オプションがあります。例えば、libx264やlibx265の
-
CPUとGPUの利用 (
-hwaccel
)- 多くの最新のCPUやGPUには、動画のエンコード/デコードを高速化するためのハードウェアアクセラレーション機能が搭載されています(例: Intel Quick Sync Video, NVIDIA NVENC/NVDEC, AMD VCE/VCN, Apple Silicon VideoToolbox)。ffmpegはこれらのハードウェアアクセラレーションを利用できます。
- macOSの場合、Apple SiliconやIntel CPUに搭載されたVideoToolboxを利用できる場合があります。
-hwaccel videotoolbox
オプションや、VideoToolboxエンコーダー/デコーダー (h264_videotoolbox
,hevc_videotoolbox
など) を指定することでハードウェアエンコーディングを利用できます。 -
例: VideoToolboxを使ってH.264エンコードを行う
bash
ffmpeg -i input.mp4 -c:v h264_videotoolbox -b:v 2M output.mp4 -
ハードウェアエンコーディングはソフトウェアエンコーディングと比較して速度は大幅に向上しますが、品質や機能(フィルターの適用など)に制限がある場合があります。また、利用可能なハードウェアアクセラレーションはMacのモデルやmacOSのバージョン、ffmpegのコンパイル設定によって異なります。
-
エンコーダーオプション:
- 各エンコーダーは非常に多くの詳細オプションを持っています。これらを調整することで、特定の目的(ファイルサイズの最小化、特定の再生環境への最適化、低遅延エンコーディングなど)に合わせてパフォーマンスや品質をさらに調整できます。これらのオプションは
-vf
,-af
のようなフィルターとは異なり、-codec_name_option value
または-option_name value
の形式で指定されます。 - 例: libx264で2パスエンコーディングを行う(より良い品質とファイルサイズ制御のため)
1パス目 (統計情報収集):ffmpeg -i input.mp4 -c:v libx264 -preset medium -b:v 2M -pass 1 -f null /dev/null
2パス目 (本エンコード):ffmpeg -i input.mp4 -c:v libx264 -preset medium -b:v 2M -pass 2 output.mp4
- 詳細なオプションについては、ffmpegのエンコーダー固有のドキュメントを参照する必要があります (
ffmpeg -h encoder=libx264
などで基本的なオプションを確認できます)。
- 各エンコーダーは非常に多くの詳細オプションを持っています。これらを調整することで、特定の目的(ファイルサイズの最小化、特定の再生環境への最適化、低遅延エンコーディングなど)に合わせてパフォーマンスや品質をさらに調整できます。これらのオプションは
-
ストリームコピー (
-c copy
) の活用:- フォーマット変換や切り出しなどで、動画や音声ストリームを再エンコードする必要がない場合は、必ず
-c copy
を使用してください。これにより、処理速度が劇的に向上し、品質劣化も全くありません。処理時間の大部分はエンコード/デコードにかかるため、これを省略できるのは非常に大きなメリットです。
- フォーマット変換や切り出しなどで、動画や音声ストリームを再エンコードする必要がない場合は、必ず
8. ffmpeg利用時の注意点とトラブルシューティング
ffmpegは強力ですが、コマンドラインツールであるため、GUIツールとは異なる注意点があります。
-
著作権について:
- 著作権で保護されたコンテンツ(DVD, Blu-ray, ストリーミングサービスからダウンロードした動画など)を、権利者の許諾なくコピー、変換、再配布することは著作権法に違反する可能性があります。ffmpegは技術的に様々なフォーマットに対応していますが、その利用は法律の範囲内で行ってください。個人が私的に利用する場合でも、各国の法律を確認することが重要です。本記事は技術的な使い方を解説するものであり、著作権侵害を推奨するものではありません。
-
コマンドの実行環境(ターミナル):
- ファイル名やパスにスペースや特殊文字が含まれる場合は、引用符(シングルクォート
'
またはダブルクォート"
)で囲む必要があります。例:-i "My Video.mp4"
- 複雑なコマンドを何度も実行する場合や、複数のコマンドを連携させる場合は、シェルスクリプトを作成すると便利です。
- ファイル名やパスにスペースや特殊文字が含まれる場合は、引用符(シングルクォート
-
エラーメッセージの読み方:
- ffmpegは多くの情報をターミナルに出力します。エラーが発生した場合、出力されるメッセージの中に原因の手がかりが含まれています。特に、エラーメッセージの最後の部分や、
[エラーの種類] message
のような形式の行に注目してください。例えば、「Codec not found」は指定したコーデックが利用できない、「Input file not found」は入力ファイルが見つからない、といった意味です。分からないエラーメッセージはそのままWebで検索すると、解決策が見つかることが多いです。
- ffmpegは多くの情報をターミナルに出力します。エラーが発生した場合、出力されるメッセージの中に原因の手がかりが含まれています。特に、エラーメッセージの最後の部分や、
-
よくある問題とその解決策:
- ファイルパスの問題: 入力ファイルや出力ファイルのパスが間違っている、ファイル名に特殊文字が含まれている、権限がないなどが考えられます。パスを正確に指定し、必要であれば絶対パスを使用するか、実行ディレクトリをファイルがある場所に移動してからコマンドを実行してください。ファイルやディレクトリへのアクセス権限があるか確認してください。
- コーデックの問題: 指定したコーデックがffmpegにコンパイルされていない、あるいはインストールされていない可能性があります。
ffmpeg -codecs
コマンドで利用可能なコーデックを確認してください。必要なコーデックが含まれていない場合は、Homebrewでオプションを指定してffmpegを再インストールする必要があります。 - 依存関係の問題: Homebrewでインストールした場合、依存関係は自動で解決されますが、手動でコンパイルした場合や、Homebrew以外の方法でインストールした場合は、必要なライブラリが不足している可能性があります。
- 入力ファイルの破損: 入力ファイル自体が破損している場合、ffmpegが正常に読み込めないことがあります。他のメディアプレイヤーで再生できるか確認したり、別のファイルで試したりしてみてください。
- 出力フォーマットとコーデックの非互換: 指定した出力コンテナフォーマットが、選択した動画/音声コーデックの組み合わせをサポートしていない場合があります。例えば、MP4コンテナはVP9+Opusの組み合わせには非対応です。このような場合は、出力フォーマットやコーデックの組み合わせを変更する必要があります。
Non-monotonous timestamps
警告: 動画や音声ストリームのタイムスタンプが連続的でないことを示す警告です。特に-c copy
で切り出しを行う場合や、複数のファイルを結合する場合に発生しやすいですが、多くの場合問題なく処理は完了します。ただし、再生時にわずかな不具合(音飛び、映像の瞬間的な停止など)が発生する可能性はあります。再エンコードすることで解消されることが多いですが、時間がかかります。
-
公式ドキュメントやコミュニティの活用:
- ffmpegの公式ドキュメント (https://ffmpeg.org/documentation.html) は非常に詳細で、全てのオプションやフィルター、デムクサー/ムクサー、プロトコルなどについて記述されています。ただし、内容が膨大で初心者には難しいかもしれません。
- ffmpegのWiki (https://trac.ffmpeg.org/wiki) には、よくあるタスクのコマンド例やチュートリアルが豊富に掲載されており、実践的な情報を得るのに非常に役立ちます。
- Stack OverflowなどのプログラミングQ&Aサイトや、ffmpeg関連のフォーラム、Discordサーバーなどで質問することも有効です。質問する際は、使用したコマンド、発生したエラーメッセージ、入力ファイルの情報の詳細(
ffprobe input.mp4
の出力など)を正確に伝えるようにしましょう。
9. さらに学ぶために
ffmpegの機能は非常に広範です。本記事で紹介したのはそのほんの一握りです。さらにffmpegを使いこなすために、以下のリソースを活用することをおすすめします。
- ffmpeg公式ドキュメント: 全ての情報源ですが、網羅的すぎて読むのが大変かもしれません。特定のオプションやフィルターについて調べたい場合に参照します。
- ffmpeg Wiki: 実践的なタスクの例が多く、まずはここから調べ始めるのがおすすめです。例えば、「Concatenation」「Filtering Guide」「Seeking」といったページはよく参照されます。
- オンラインチュートリアルやブログ記事: Web上には、ffmpegの特定の機能やタスクに焦点を当てた解説記事が多数存在します。「ffmpeg [やりたいこと]」で検索すると多くの情報が見つかります。
- 関連書籍: ffmpegを体系的に解説した書籍も出版されています。コマンドラインツールの使い方に慣れてきたら、腰を据えて学ぶための良いリソースとなります。
ffprobe
コマンド: 動画や音声ファイルの情報を詳しく知ることは、適切なffmpegコマンドを組み立てる上で非常に重要です。ffprobe -hide_banner input.mp4
のように実行し、ファイルの構造やストリーム情報を確認する習慣をつけましょう。特に複数のストリーム(複数の音声トラック、字幕トラックなど)を持つファイルを扱う場合に不可欠です。
10. まとめ
本記事では、macOSにおけるffmpegのインストール方法から、動画・音声処理の基本的なコマンドまでを詳細に解説しました。
ffmpegは、コマンドラインベースであるがゆえに最初は敷居が高く感じられるかもしれません。しかし、Homebrewを使えばmacOSへのインストールは非常に簡単に行えます。そして、一度基本的なコマンド構造とオプションの種類を理解してしまえば、その強力さと柔軟性に驚くはずです。
- ファイルのフォーマット変換
- 解像度やフレームレートの変更
- 動画や音声の切り出し、連結
- 音声の抽出や置き換え
- 字幕やロゴの追加
といった日常的なタスクから、フィルターグラフを駆使した複雑な処理まで、ffmpeg一つで多様なメディア処理ニーズに対応できます。特に、複数のファイルに対するバッチ処理や、特定の繰り返し作業を自動化する際には、ffmpegのコマンドラインツールとしての利便性が際立ちます。
この記事が、macOSユーザーの皆様がffmpegを使い始めるための一助となり、メディア処理の可能性をさらに広げるきっかけとなれば幸いです。 ffmpegの学習は奥深く、探求する価値のある分野です。ぜひ様々なコマンドを試してみて、ffmpegの強力さを実感してください。