動画フォーマットの変換は、メディア処理で最も一般的なタスクの一つです。Web向けのMP4、Appleワークフロー向けのMOV、オープンソースプロジェクト向けのWebMなど、FFmpegはすべてコマンドラインで処理できます。このガイドでは、基本的な変換から高度なコーデック選択、一括処理まで網羅的に解説します。
基本的なフォーマット変換
最もシンプルな変換は、コンテナフォーマットを変更するだけです。FFmpegはファイル拡張子から出力フォーマットを自動検出します:
# MKVをMP4に変換
ffmpeg -i input.mkv output.mp4
# AVIをMOVに変換
ffmpeg -i input.avi output.mov
# MP4をWebMに変換
ffmpeg -i input.mp4 output.webmコーデックを指定しない場合、FFmpegはターゲットコンテナのデフォルト値を使用します。動作はしますが、品質や互換性を制御することはできません。
コンテナとコーデックの違い
深掘りする前に、この違いを理解しておくと役立ちます:
- コンテナ(MP4、MKV、MOV、AVI、WebM)— 動画、音声、メタデータを格納するファイル形式
- 動画コーデック(H.264、H.265、VP9、AV1)— 動画データの圧縮方式
- 音声コーデック(AAC、Opus、MP3、FLAC)— 音声データの圧縮方式
コンテナは箱のようなもので、コーデックは中身です。同じ動画コーデックを異なるコンテナに入れることができます。
| コンテナ | 一般的な動画コーデック | 一般的な音声コーデック | 最適な用途 |
|---|---|---|---|
| MP4 | H.264, H.265, AV1 | AAC, MP3 | Web、モバイル、汎用 |
| MKV | 任意 | 任意 | アーカイブ、マルチトラックメディア |
| MOV | H.264, H.265, ProRes | AAC, PCM | Appleエコシステム、編集 |
| WebM | VP8, VP9, AV1 | Vorbis, Opus | Web(オープンソース) |
| AVI | H.264, MPEG-4 | MP3, PCM | レガシー互換性 |
コーデック選択ガイド
H.264 — 最大の互換性
H.264(libx264)は、ほぼすべてのデバイスとブラウザで再生できます。一般的な配信には最も安全な選択です。
ffmpeg -i input.avi -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4H.265(HEVC)— より優れた圧縮
H.265(libx265)は、同じ品質で約50%小さいファイルを生成します。対応は広がっていますが、まだ完全ではありません。
ffmpeg -i input.avi -c:v libx265 -crf 28 -preset medium -c:a aac -b:a 128k output.mp4注意:H.265は異なるCRFスケールを使用します。H.265のCRF 28はH.264のCRF 23とほぼ同等です。
VP9 — オープンソースでWeb向け
VP9はGoogleのロイヤリティフリーコーデックです。WebMと組み合わせて使い、すべてのモダンブラウザで対応しています。
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus -b:a 128k output.webm-b:v 0は、純粋なCRFモードを使用するようFFmpegに指示します(ビットレート上限なし)。
AV1 — 次世代コーデック
AV1は最高の圧縮率を提供しますが、エンコードが非常に遅いです。時間に余裕があり、最小のファイルが必要な場合に使用してください。
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 -cpu-used 4 -c:a libopus -b:a 128k output.mkv-cpu-used 4はエンコードを大幅に高速化します(範囲0-8、高いほど速いが品質は低下)。
コーデック比較
| コーデック | 圧縮率 | 速度 | ブラウザ対応 | ライセンス |
|---|---|---|---|---|
| H.264 | 良好 | 高速 | ユニバーサル | ライセンス制 |
| H.265 | 優良 | 中速 | 拡大中 | ライセンス制 |
| VP9 | 優良 | 低速 | 全モダンブラウザ | ロイヤリティフリー |
| AV1 | 最良 | 非常に低速 | 拡大中 | ロイヤリティフリー |
音声コーデックの組み合わせ
各コンテナには最適な音声コーデックがあります:
# MP4 + AAC(最も一般的な組み合わせ)
ffmpeg -i input.mkv -c:v libx264 -crf 23 -c:a aac -b:a 192k output.mp4
# WebM + Opus(ビットレートあたり最高品質)
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus -b:a 128k output.webm
# MKV + FLAC(ロスレスオーディオ)
ffmpeg -i input.mov -c:v libx264 -crf 18 -c:a flac output.mkv
# MOV + PCM(非圧縮、編集用)
ffmpeg -i input.mp4 -c:v copy -c:a pcm_s16le output.mov| 音声コーデック | 品質 | ファイルサイズ | 最適なコンテナ |
|---|---|---|---|
| AAC | 良好 | 小 | MP4, MOV |
| Opus | 優秀 | 最小 | WebM, MKV |
| MP3 | 良好 | 小 | MP4, AVI, MKV |
| FLAC | ロスレス | 大 | MKV |
| PCM | ロスレス | 非常に大 | MOV, WAV |
ストリームコピー — 瞬時の変換
ソースコーデックがターゲットコンテナと互換性がある場合、再エンコードなしでストリームをコピーできます。これは瞬時かつ無劣化です:
# MKVをMP4に再エンコードなしでリマックス
ffmpeg -i input.mkv -c copy output.mp4
# 動画はコピー、音声のみ再エンコード
ffmpeg -i input.mkv -c:v copy -c:a aac -b:a 128k output.mp4ストリームコピーは、コーデックがターゲットコンテナで対応されている場合のみ機能します。例えば、VP9動画をAVIコンテナに入れることはできません。
品質 vs ファイルサイズ
CRFモード — ローカルファイルに最適
CRF(固定品質係数)は、品質とサイズの最適なバランスを提供します。エンコーダーはシーンごとにビットレートを調整します。圧縮テクニックの詳細については、動画圧縮ガイドをご覧ください。
# 高品質(大きなファイル)
ffmpeg -i input.avi -c:v libx264 -crf 18 -c:a aac -b:a 192k output.mp4
# バランスの取れた品質
ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4
# 小さなファイル(低品質)
ffmpeg -i input.avi -c:v libx264 -crf 28 -c:a aac -b:a 96k output.mp42パスエンコード — ターゲットファイルサイズに最適
特定のファイルサイズが必要な場合は、2パスエンコードを使用します:
# パス1:解析
ffmpeg -i input.avi -c:v libx264 -b:v 2M -pass 1 -an -f null /dev/null
# パス2:エンコード
ffmpeg -i input.avi -c:v libx264 -b:v 2M -pass 2 -c:a aac -b:a 128k output.mp4プリセット — 速度 vs 圧縮率
遅いプリセットほど、同じ品質でより小さなファイルを生成します:
# 高速エンコード、大きなファイル
ffmpeg -i input.avi -c:v libx264 -crf 23 -preset fast -c:a aac output.mp4
# 低速エンコード、小さなファイル
ffmpeg -i input.avi -c:v libx264 -crf 23 -preset slow -c:a aac output.mp4解像度変更を伴う変換
フォーマット変換とスケーリングを組み合わせます:
# 720p MP4に変換
ffmpeg -i input.mkv -c:v libx264 -crf 23 -vf "scale=-2:720" -c:a aac -b:a 128k output.mp4
# 1080p WebMに変換
ffmpeg -i input.avi -c:v libvpx-vp9 -crf 30 -b:v 0 -vf "scale=-2:1080" -c:a libopus output.webm一括変換スクリプト
ディレクトリ内のすべてのファイルを変換
# すべてのAVIファイルをMP4に変換
for f in *.avi; do
ffmpeg -i "$f" -c:v libx264 -crf 23 -c:a aac -b:a 128k "${f%.avi}.mp4"
done
# すべてのMKVファイルをMP4に変換(可能ならストリームコピー)
for f in *.mkv; do
ffmpeg -i "$f" -c copy "${f%.mkv}.mp4"
doneフォーマットごとにカスタム品質で変換
#!/bin/bash
# 複数フォーマットへの一括変換
INPUT="input.mp4"
# Web最適化MP4
ffmpeg -i "$INPUT" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k -movflags +faststart web.mp4
# 高品質MKVアーカイブ
ffmpeg -i "$INPUT" -c:v libx265 -crf 22 -preset slow -c:a flac archive.mkv
# オープンソースホスティング用WebM
ffmpeg -i "$INPUT" -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus -b:a 128k web.webm再帰的変換
# すべてのAVIファイルを再帰的に検索して変換
find . -name "*.avi" -exec sh -c '
ffmpeg -i "$1" -c:v libx264 -crf 23 -c:a aac "${1%.avi}.mp4"
' _ {} \;Web最適化 — faststart
Webで配信するMP4ファイルには、必ず-movflags +faststartを追加してください。これによりメタデータがファイルの先頭に移動し、ダウンロードが完了する前に再生を開始できるようになります:
ffmpeg -i input.mkv -c:v libx264 -crf 23 -c:a aac -movflags +faststart output.mp4よく使う変換レシピ
最も頻繁な変換にすぐ使えるコマンドです:
# MOV(iPhone)をMP4に変換して共有
ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac -b:a 128k -movflags +faststart output.mp4
# AVIをMP4に変換(再エンコード)
ffmpeg -i input.avi -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
# MP4をWebMに変換してWeb埋め込み
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus -b:a 128k output.webm
# MKVをMP4に変換(無劣化リマックス)
ffmpeg -i input.mkv -c copy -movflags +faststart output.mp4
# 任意のフォーマットをGIFに変換(短いクリップ)
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1" -t 5 output.gif
# MP4をHLSに変換してストリーミング
ffmpeg -i input.mp4 -c copy -hls_time 10 -hls_list_size 0 output.m3u8トラブルシューティング
「Discarding packet」警告 — ソースコンテナに互換性の問題があります。-err_detect ignore_errを追加して破損パケットをスキップしてください。
「Non-monotonous DTS」エラー — ソースのタイムスタンプに問題があります。以下で修正できます:
ffmpeg -i input.mkv -fflags +genpts -c:v libx264 -crf 23 -c:a aac output.mp4コンテナでコーデックが非対応 — 非互換のコーデックをコンテナに入れようとしています(例:AVIにVP9)。コンテナを変更するか、互換性のあるコーデックで再エンコードしてください。
出力ファイルが入力より大きい — より効率的なコーデックから効率の低いコーデックに変換した場合、またはソースが強く圧縮されていた場合に発生します。CRF値を下げるか、より効率的なコーデックを使用してみてください。
FFHubによるクラウド代替
動画フォーマットのローカル変換は単発の作業には問題ありませんが、一括変換はマシンを何時間も占有する可能性があります。FFHubを使えば、クラウドでAPI経由でFFmpegコマンドを実行できます — 同じFFmpeg構文で、ローカルCPUの負荷はゼロです。
大量のファイルを変換する必要がある場合、フォーマット変換をWebアプリケーションに統合する場合、またはFFmpegがインストールされていないマシンで動画を処理する場合に特に有用です。
まとめ
- コーデックが互換性のある場合はストリームコピー(
-c copy)を使用 — 瞬時に完了 - 最大の互換性には**H.264 + AAC(MP4)**を選択
- Web向けのロイヤリティフリー配信には**VP9 + Opus(WebM)**を選択
- 品質重視のエンコードにはCRFモードを使用
- Webで配信するMP4ファイルには**
-movflags +faststart**を追加 - ディレクトリ全体を一度に変換するには一括スクリプトを使用
関連記事
- FFmpegで動画を圧縮する方法 - CRF、プリセット、解像度スケーリングでファイルサイズを削減
- FFmpegで動画から音声を抽出する方法 - 任意の動画フォーマットから音声トラックを抽出
- FFmpeg動画圧縮のベストプラクティス - 最適な品質とサイズのための高度なエンコード戦略

