FFmpegを使うと、AVI・MKV・MOVなどの動画をMP4に変換できます。

前提: コーデックとコンテナの違い

  • コンテナ(拡張子): .mp4, .mkv, .avi など。映像・音声データの「入れ物」
  • コーデック: データの圧縮形式。映像は H.264 (libx264), 音声は AAC が MP4 の標準

MP4 コンテナに入れられる主なコーデックは H.264 または H.265 (HEVC) の映像と AAC の音声です。

基本コマンド

ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4
オプション 意味
-i input.avi 入力ファイルを指定
-c:v libx264 映像コーデックに H.264 (libx264) を指定
-c:a aac 音声コーデックに AAC を指定
output.mp4 出力ファイル名(拡張子 .mp4 でコンテナが決まる)

一次ソース: FFmpeg Wiki - H.264 Encoding Guide

画質の調整(CRF)

-crf で映像品質を指定します。値が小さいほど高品質になり、ファイルサイズは大きくなります。目標のファイルサイズに近づけたい場合は、CRF ではなく2パスエンコードでビットレートを制御する方法が向いています。

ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac output.mp4
CRF 値 品質目安 用途
18 視覚的無損失に近い アーカイブ
23 デフォルト。バランス良好 一般用途
28 圧縮強め サイズ優先
51 最低品質 ほぼ使用しない

「主観的に妥当な範囲は 17〜28」(FFmpeg H.264 Guide)

エンコード速度の調整(preset)

-preset で、エンコード速度と圧縮効率のどちらを優先するかを決めます。

ffmpeg -i input.avi -c:v libx264 -preset slow -crf 22 -c:a aac -b:a 128k output.mp4
preset 速度 圧縮効率
ultrafast 最速 低
fast 速い やや低
medium デフォルト バランス
slow 遅い 高
veryslow とても遅い とても高い

遅い preset ほど圧縮効率が上がります。ただし、同じ CRF でも画質とファイルサイズは preset によって変わり、遅い preset で必ず小さくなるとは限りません。 一次ソース: H.264 Guide - preset

ストリームコピー(再エンコードなし)

入力がすでに H.264/AAC のとき、再エンコードなしでコンテナだけ変換できます。

ffmpeg -i input.mkv -c copy output.mp4
  • メリット: すぐに終わり、画質も劣化しません。
  • 注意点: 入力コーデックが MP4 非対応の場合は失敗します。その場合は -c:v libx264 -c:a aac に切り替えてください。

音声ビットレートの指定

ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac -b:a 192k output.mp4
-b:a 値 用途
96k 音声のみの低品質
128k 一般的な動画
192k 音楽・音声品質優先
320k 非常に高品質

よく使うコマンド例まとめ

ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4
ffmpeg -i input.mkv -c:v libx264 -crf 22 -preset slow -c:a aac -b:a 192k output.mp4
ffmpeg -i input.mkv -c copy output.mp4
ffmpeg -y -i input.avi -c:v libx264 -crf 23 -c:a aac output.mp4

最後の -y フラグを付けると、出力ファイルが既にあっても確認せずに上書きします(バッチ処理向け)。

トラブルシューティング

Unknown encoder 'libx264' と表示される

原因: インストールした FFmpeg が libx264 を含まないビルドです。 解決策: libx264 を含む FFmpeg を入れ直してください。Windows では gyan.dev の Full ビルド を推奨します。Fedora の ffmpeg-free のように、libx264 を含まない Linux のパッケージもあります。

出力ファイルが大きすぎる

CRF 値を上げて(28〜32)ファイルサイズを削減してください。-preset を速くしても、同じ画質のままサイズが減るわけではありません。詳しくはMP4を圧縮する方法(CRF・ビットレート・preset)を参照してください。

ストリームコピーが失敗する

-c copy は入力コーデックが出力コンテナと互換性がある場合のみ動作します。失敗した場合は -c:v libx264 -c:a aac で再エンコードしてください。

よくある質問

どんな動画でも MP4 に変換できる?

コンテナとしては、ほぼすべての形式から変換できます(WebM / MOV / MKV / AVI / FLV / TS など)。ただし、コーデックによっては再エンコードが必要です。例えば Theora(.ogv)や古い FLV(Sorenson Spark)の映像は MP4 に入らないので、H.264 に再エンコードします。VP9(WebM)は -c copy のまま MP4 に入れられますが、再生できる環境が限られます。

MP4 に変換するとなぜサイズが変わる?

コンテナ自体のオーバーヘッドはほぼ同じですが、コーデックやビットレートが変わるとサイズも変わります。同じコーデックのままコンテナだけ変える remux なら、変わるのはコンテナの管理情報の分だけで、差はわずかです。再エンコードすると大きく変わります。

Web ブラウザで再生できる MP4 にしたい

-c:v libx264 -profile:v high -pix_fmt yuv420p -c:a aac -movflags +faststart の組み合わせが最も互換性が高いです。+faststart は moov atom を先頭に置き、プログレッシブ再生をできるようにします。

iPhone で撮った MOV を MP4 に変えたい

コンテナだけ変えれば変換できます: ffmpeg -i input.mov -c copy output.mp4。中身が HEVC なら、汎用性の高い H.264 への変換も推奨します: -c:v libx264 -c:a aac。

画質を落とさず MP4 化したい

元のコーデックが H.264 / AAC なら、-c copy で劣化なしに変換できます。それ以外なら CRF 17〜18 で、見た目ではほぼ劣化しません(ただしファイルサイズは大きくなります)。