この記事でわかること
- コンテナとコーデックの違い(変換前に必ず理解しておくべき前提)
- ストリームコピー(
-c copy)で瞬時に変換できるケースと失敗するケース - MKV→MP4、MP4→WebM、MOV→MP4、AVI→MP4、MP4→MKVの実践コマンド
- ffprobeで変換前後のコーデックを確認する方法
テスト済みバージョン: FFmpeg 6.1で確認済み(ubuntu-latest / CI検証済み) 対象 OS: Windows / macOS / Linux
ファイル名について: この記事では入力ファイルを
input.mkv、input.mp4などの仮ファイル名で記載しています。実際のコマンドでは処理したいファイルのパスに置き換えてください。
コンテナとコーデックの違い
動画ファイルを扱うときに最も混乱しやすいのがコンテナとコーデックの区別です。
| 概念 | 説明 | 例 |
|---|---|---|
| コンテナ(拡張子) | 映像・音声・字幕などをまとめる「入れ物」 | .mp4, .mkv, .webm, .mov, .avi |
| 映像コーデック | 映像データの圧縮方式 | H.264, H.265, VP9, AV1 |
| 音声コーデック | 音声データの圧縮方式 | AAC, MP3, Opus, Vorbis |
拡張子を変えるだけでは変換になりません。たとえば .avi ファイルの中身が H.264+AAC であれば、コンテナをMP4に「詰め替える」だけで済みます(ストリームコピー)。一方、VP9映像が入ったWebMをMOVに変換するには、コーデックの再エンコードが必要になる場合があります。
コーデックの確認方法(ffprobe)
変換前にコーデックを確認しておくと、適切な方法を選択できます。
ffprobe -v error -show_streams -select_streams v:0 input.mp4
ffprobe -v error -show_entries stream=codec_name,codec_type -of default=noprint_wrappers=1 input.mkv
-hide_bannerや-show_streamsのみで出力ファイルを持たないコマンドはtextブロックに記載しています。
ストリームコピー(-c copy)の使いどころ
コンテナだけ変換したい場合(コーデックはそのまま)は -c copy が最速です。
ffmpeg -i input.mkv -c copy output.mp4
メリット:
- 再エンコードなしで完了(数秒〜数十秒)
- 画質・音質の劣化ゼロ
注意点・失敗するケース:
- 出力コンテナが入力コーデックに対応していない場合は失敗します
- 例: VP9映像が入ったMKVを
-c copyでMP4に変換しようとすると、MP4がVP9をサポートしないためエラーになります -c copyが失敗したら再エンコードに切り替えてください
主要な変換コマンド
MKV → MP4(ストリームコピー)
MKVの中身がH.264+AACなら1コマンドで瞬時に変換できます。
ffmpeg -i input.mkv -c copy output.mp4
中身が別コーデックで失敗した場合は再エンコードします。
ffmpeg -i input.mkv -c:v libx264 -crf 23 -c:a aac output.mp4
MOV → MP4(iPhone・Mac動画の変換)
iPhoneやMacで撮影したMOVファイルはH.264/HEVCがほとんどなので、ストリームコピーが有効なケースが多いです。
ffmpeg -i input.mov -c copy output.mp4
HEVC(H.265)映像を含む場合で互換性優先なら再エンコードします。
ffmpeg -i input.mov -c:v libx264 -crf 22 -c:a aac output.mp4
AVI → MP4(古い形式からの変換)
AVIはコーデックが多様なため、安全のために再エンコードを推奨します。
ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac output.mp4
MP4 → MKV(コンテナ変換のみ)
MKVはほぼすべてのコーデックを収容できるため、ストリームコピーが安定して動作します。
ffmpeg -i input.mp4 -c copy output.mkv
MP4 → WebM(Web配信向け)
WebMはVP8/VP9映像とVorbis/Opus音声の組み合わせが標準です。ブラウザ配信に適しています。
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus output.webm
| オプション | 意味 |
|---|---|
-c:v libvpx-vp9 | VP9エンコーダーを使用 |
-crf 30 -b:v 0 | 品質固定モード(CRFモード) |
-c:a libopus | Opusエンコーダーを使用(WebMの推奨音声) |
コーデック自動選択の仕組み
出力コンテナを指定するだけでFFmpegがデフォルトコーデックを自動選択します。
ffmpeg -i input.avi output.mp4
このコマンドでは、MP4コンテナのデフォルトである libx264(映像)と aac(音声)が自動選択されます。ただし品質コントロールができないため、-crf などを明示的に指定することを推奨します。
各コンテナの主要対応コーデック
| コンテナ | 主な映像コーデック | 主な音声コーデック |
|---|---|---|
| MP4 | H.264, H.265 | AAC, MP3 |
| MKV | H.264, H.265, VP9, AV1 など | AAC, MP3, Opus, FLAC など |
| WebM | VP8, VP9, AV1 | Vorbis, Opus |
| MOV | H.264, H.265, ProRes | AAC, PCM |
| AVI | H.264, DivX, Xvid など | MP3, PCM など |
よくあるエラーと対処法
Could not write header for output file エラー
コーデックとコンテナの互換性問題です。-c copy から -c:v libx264 -c:a aac に切り替えてください。
Encoder not found エラー
インストールしたFFmpegビルドに該当コーデックが含まれていません。公式サイトや gyan.dev(Windows)からフル機能ビルドを再インストールしてください。
WebMへの変換が極端に遅い
VP9はエンコードに時間がかかります。速度優先なら -cpu-used 4 オプションを追加してください。
関連記事
動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner) 一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-formats.html / trac.ffmpeg.org/wiki/Encode/H.264