FFmpeg で動画フォーマットを変換する方法
FFmpeg で MP4・MOV・AVI・WebM・MKV を変換する手順。codec の選び方、品質調整、バッチ処理スクリプトまで網羅。

動画フォーマットの変換は、メディア処理でもっとも頻繁に発生する作業の一つです。Web 配信用の MP4、Apple ワークフロー向けの MOV、オープンソースプロジェクトで使う WebM など、用途は多岐にわたります。FFmpeg はこれらすべてをコマンドラインから処理できます。本記事では基本的な変換から、codec 選定、バッチ処理までを順に解説します。
一番シンプルな変換方法は?
もっとも単純なのは、コンテナフォーマット(container format)だけを変える変換です。FFmpeg は出力ファイルの拡張子から自動的にフォーマットを判定します。
# Convert MKV to MP4
ffmpeg -i input.mkv output.mp4
# Convert AVI to MOV
ffmpeg -i input.avi output.mov
# Convert MP4 to WebM
ffmpeg -i input.mp4 output.webm
codec を指定しない場合、FFmpeg が出力コンテナに合わせてデフォルトを選びます。動作はしますが、品質や互換性をコントロールすることはできません。
コンテナと codec の違いは?
先に進む前に、両者の違いを押さえておきましょう。
- コンテナ(MP4, MKV, MOV, AVI, WebM)— 映像・音声・メタデータを格納するファイル形式
- 動画 codec(H.264, H.265, VP9, AV1)— 映像データの圧縮方式
- 音声 codec(AAC, Opus, MP3, FLAC)— 音声データの圧縮方式
コンテナは「箱」、codec は「中身」と考えると分かりやすいです。同じ動画 codec を別々のコンテナに収めることもできます。
| Container | 主な動画 codec | 主な音声 codec | 用途 |
|---|---|---|---|
| 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 | レガシー互換 |
codec はどう選ぶか?
H.264 — 互換性が最強
H.264(libx264)はほぼすべてのデバイスとブラウザで再生できます。配布用としては一番安全な選択肢です。
ffmpeg -i input.avi -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
H.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.264 と異なります。H.265 の CRF 28 は、H.264 の CRF 23 にほぼ相当します。
VP9 — オープンソースで Web 向き
VP9 は Google が公開しているロイヤリティフリーの codec です。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 モード(ビットレート上限なし)になります。
AV1 — 次世代 codec
AV1 はもっとも圧縮効率が良い反面、エンコーディング(encoding)が非常に遅いです。時間に余裕があり、ファイルサイズを最小化したいときに使います。
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、大きいほど速いが品質は下がる)。
codec の比較
| Codec | 圧縮率 | 速度 | ブラウザ対応 | ライセンス |
|---|---|---|---|---|
| H.264 | 良い | 速い | ほぼ全て | ライセンス必要 |
| H.265 | 高い | 中 | 拡大中 | ライセンス必要 |
| VP9 | 高い | 遅い | モダン全て | ロイヤリティフリー |
| AV1 | 最高 | 非常に遅い | 拡大中 | ロイヤリティフリー |
音声 codec はどう組み合わせる?
各コンテナには相性の良い音声 codec があります。
# MP4 + AAC (most common pairing)
ffmpeg -i input.mkv -c:v libx264 -crf 23 -c:a aac -b:a 192k output.mp4
# WebM + Opus (best quality per bitrate)
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus -b:a 128k output.webm
# MKV + FLAC (lossless audio)
ffmpeg -i input.mov -c:v libx264 -crf 18 -c:a flac output.mkv
# MOV + PCM (uncompressed, for editing)
ffmpeg -i input.mp4 -c:v copy -c:a pcm_s16le output.mov
| 音声 Codec | 品質 | ファイルサイズ | 推奨コンテナ |
|---|---|---|---|
| AAC | 良い | 小 | MP4, MOV |
| Opus | 非常に良い | 最小 | WebM, MKV |
| MP3 | 良い | 小 | MP4, AVI, MKV |
| FLAC | ロスレス | 大 | MKV |
| PCM | ロスレス | 非常に大 | MOV, WAV |
再エンコードなしで瞬時に変換できる?
ソースの codec が出力コンテナで使えるなら、再エンコードせずにストリームをコピーできます。瞬時に終わり、しかもロスレスです。
# Remux MKV to MP4 without re-encoding
ffmpeg -i input.mkv -c copy output.mp4
# Copy video, re-encode audio only
ffmpeg -i input.mkv -c:v copy -c:a aac -b:a 128k output.mp4
ストリームコピーは、出力コンテナがその codec をサポートしている場合にのみ使えます。たとえば VP9 の動画を AVI に入れることはできません。
品質とファイルサイズはどう調整する?
CRF モード — ローカルファイル向け
CRF(Constant Rate Factor)はサイズと品質のバランスがもっとも良いモードです。エンコーダーがシーンごとにビットレートを調整します。圧縮の詳細は 動画圧縮ガイド を参照してください。
# High quality (larger file)
ffmpeg -i input.avi -c:v libx264 -crf 18 -c:a aac -b:a 192k output.mp4
# Balanced quality
ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4
# Smaller file (lower quality)
ffmpeg -i input.avi -c:v libx264 -crf 28 -c:a aac -b:a 96k output.mp4
2-pass エンコード — ファイルサイズを揃えたいとき
特定のファイルサイズに合わせたい場合は、2-pass エンコードを使います。
# Pass 1: analyze
ffmpeg -i input.avi -c:v libx264 -b:v 2M -pass 1 -an -f null /dev/null
# Pass 2: encode
ffmpeg -i input.avi -c:v libx264 -b:v 2M -pass 2 -c:a aac -b:a 128k output.mp4
preset — 速度と圧縮率のトレードオフ
遅い preset ほど、同じ品質でもファイルサイズが小さくなります。
# Fast encoding, larger file
ffmpeg -i input.avi -c:v libx264 -crf 23 -preset fast -c:a aac output.mp4
# Slow encoding, smaller file
ffmpeg -i input.avi -c:v libx264 -crf 23 -preset slow -c:a aac output.mp4
解像度を変えながら変換するには?
フォーマット変換とスケーリングを同時に行えます。
# Convert to 720p MP4
ffmpeg -i input.mkv -c:v libx264 -crf 23 -vf "scale=-2:720" -c:a aac -b:a 128k output.mp4
# Convert to 1080p WebM
ffmpeg -i input.avi -c:v libvpx-vp9 -crf 30 -b:v 0 -vf "scale=-2:1080" -c:a libopus output.webm
まとめて変換するには?
ディレクトリ内のファイルを一括変換
# Convert all AVI files to MP4
for f in *.avi; do
ffmpeg -i "$f" -c:v libx264 -crf 23 -c:a aac -b:a 128k "${f%.avi}.mp4"
done
# Convert all MKV files to MP4 (stream copy if possible)
for f in *.mkv; do
ffmpeg -i "$f" -c copy "${f%.mkv}.mp4"
done
フォーマットごとに品質を変える
#!/bin/bash
# Batch convert to multiple formats
INPUT="input.mp4"
# Web-optimized MP4
ffmpeg -i "$INPUT" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k -movflags +faststart web.mp4
# High-quality MKV archive
ffmpeg -i "$INPUT" -c:v libx265 -crf 22 -preset slow -c:a flac archive.mkv
# WebM for open-source hosting
ffmpeg -i "$INPUT" -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus -b:a 128k web.webm
再帰的に変換
# Find and convert all AVI files recursively
find . -name "*.avi" -exec sh -c '
ffmpeg -i "$1" -c:v libx264 -crf 23 -c:a aac "${1%.avi}.mp4"
' _ {} \;
Web 配信向けの最適化は?
Web で配信する MP4 には、必ず -movflags +faststart を付けましょう。メタデータをファイル先頭に移動させることで、ダウンロード完了前に再生を始められるようになります。
ffmpeg -i input.mkv -c:v libx264 -crf 23 -c:a aac -movflags +faststart output.mp4
よく使うレシピは?
頻出ケース向けにそのまま使えるコマンドを並べておきます。
# MOV (iPhone) to MP4 for sharing
ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac -b:a 128k -movflags +faststart output.mp4
# AVI to MP4 (re-encode)
ffmpeg -i input.avi -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
# MP4 to WebM for web embedding
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus -b:a 128k output.webm
# MKV to MP4 (lossless remux)
ffmpeg -i input.mkv -c copy -movflags +faststart output.mp4
# Any format to GIF (short clip)
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1" -t 5 output.gif
# MP4 to HLS for streaming
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
コンテナで codec がサポートされない — 互換性のない codec を入れようとしています(例:VP9 を AVI に入れる)。コンテナを変えるか、対応する codec で再エンコードしてください。
出力ファイルが入力より大きい — 効率の良い codec から悪い codec に変換した、もしくはソース側がすでに強く圧縮されているケースです。CRF 値を下げるか、効率の高い codec に切り替えてみてください。
クラウドで動かす選択肢
ローカルでの動画変換は単発の作業なら問題ありませんが、バッチ変換ではマシンが何時間も占有されます。FFHub を使えば API 経由でクラウド上の FFmpeg を呼び出せます。FFmpeg のシンタックスはそのまま、ローカル CPU を使いません。
大量のファイルを変換するとき、Web アプリにフォーマット変換を組み込むとき、FFmpeg をインストールしていないマシンで処理したいときに便利です。
まとめ
- codec が互換なら ストリームコピー(
-c copy)を使う — 瞬時に終わる - 互換性最重視なら MP4 + H.264 + AAC
- Web でロイヤリティフリーにしたいなら WebM + VP9 + Opus
- 品質重視のエンコードには CRF モード を使う
- Web 配信の MP4 には
-movflags +faststartを必ず付ける - ディレクトリ単位の処理は バッチスクリプト で自動化する
関連記事
- How to Compress Video with FFmpeg - Reduce file size with CRF, presets, and resolution scaling
- How to Extract Audio from Video with FFmpeg - Pull audio tracks from any video format
- FFmpeg Video Compression Best Practices - Advanced encoding strategies for optimal quality and size