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 で、見た目ではほぼ劣化しません(ただしファイルサイズは大きくなります)。