この記事でわかること

  • コンテナとコーデックの違い(変換前に必ず理解しておくべき前提)
  • ストリームコピー(-c copy)で瞬時に変換できるケースと失敗するケース
  • MKV→MP4、MP4→WebM、MOV→MP4、AVI→MP4、MP4→MKVの実践コマンド
  • ffprobeで変換前後のコーデックを確認する方法

テスト済みバージョン: FFmpeg 6.1で確認済み(ubuntu-latest / CI検証済み) 対象 OS: Windows / macOS / Linux

ファイル名について: この記事では入力ファイルを input.mkvinput.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-vp9VP9エンコーダーを使用
-crf 30 -b:v 0品質固定モード(CRFモード)
-c:a libopusOpusエンコーダーを使用(WebMの推奨音声)

コーデック自動選択の仕組み

出力コンテナを指定するだけでFFmpegがデフォルトコーデックを自動選択します。

ffmpeg -i input.avi output.mp4

このコマンドでは、MP4コンテナのデフォルトである libx264(映像)と aac(音声)が自動選択されます。ただし品質コントロールができないため、-crf などを明示的に指定することを推奨します。


各コンテナの主要対応コーデック

コンテナ主な映像コーデック主な音声コーデック
MP4H.264, H.265AAC, MP3
MKVH.264, H.265, VP9, AV1 などAAC, MP3, Opus, FLAC など
WebMVP8, VP9, AV1Vorbis, Opus
MOVH.264, H.265, ProResAAC, PCM
AVIH.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


よくある質問

コーデックを変えずにコンテナだけ変更したい

ffmpeg -i input.mov -c copy output.mp4 で再エンコードなしの remux。MOV ↔ MP4、MKV → MP4 などコーデック対応関係さえ合えば瞬時に終わる。

WebM を MP4 に変換すると音が出ない

WebM の Vorbis / Opus 音声は MP4 で完全互換ではない。-c:a aac -b:a 128k で AAC に再エンコードしてください。

AVI から MP4 への変換で画質が落ちる

AVI 内のコーデックを直接 MP4 に入れられる場合(DivX/Xvid → MP4 など)はストリームコピーで無劣化。再エンコードが必要なら CRF 18 で視覚的に同等。

動画コンテナによって何が違うの?

中身(コーデック)は同じでも、コンテナによって対応プレーヤー、メタデータ表現、ストリーミング適性が変わる。Web 配信なら MP4、PC 中心なら MKV、Apple エコシステムなら MOV。

iPhone で撮った HEIC / HEVC は変換が必要?

汎用 Web 共有なら H.264 MP4 への変換推奨。ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4。Apple 同士の共有なら HEVC のままで OK。