← All posts

FFmpeg で動画フォーマットを変換する方法

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

FFHub·2026-04-21
FFmpeg で動画フォーマットを変換する方法

動画フォーマットの変換は、メディア処理でもっとも頻繁に発生する作業の一つです。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用途
MP4H.264, H.265, AV1AAC, MP3Web、モバイル、汎用
MKV何でも何でもアーカイブ、マルチトラック
MOVH.264, H.265, ProResAAC, PCMApple エコシステム、編集
WebMVP8, VP9, AV1Vorbis, OpusWeb(オープンソース)
AVIH.264, MPEG-4MP3, 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 を必ず付ける
  • ディレクトリ単位の処理は バッチスクリプト で自動化する

関連記事

FFmpeg で動画フォーマットを変換する方法 | FFHub