FFmpegでWebMをMP4に変換すると、編集ソフトやスマホでも扱いやすくなります。WebMは、ブラウザの画面録画やWebRTCのキャプチャなどで使われる形式です。Web用途には向いていますが、編集ソフト・スマホ・古いメディアプレーヤーはVP8/VP9映像やOpus/Vorbis音声をうまく扱えないことがよくあります。変換は多くの場合H.264 + AACへの再エンコードで、これならほぼどの環境でも再生できます。
1. WebMが通常は再エンコードを必要とする理由
MP4(ISOベースメディアファイルフォーマット)は、コンテナとして「許可されたコーデック」が決まっています。iPhone・Premiere Pro・スマートTVで再生できる組み合わせは、実質的にH.264/HEVC映像 + AAC音声です。
一方、WebMに入っているコーデックは次のとおりです。
| ストリーム | WebMのコーデック | MP4と互換性あり? |
|---|---|---|
| 映像 | VP8、VP9、AV1 | VP9/AV1は技術的には可、VP8は不可 |
| 音声 | Opus、Vorbis | Opusは可(非対応の再生環境あり)、Vorbisはほぼ非対応 |
MP4内のOpusはブラウザなどでは再生できるものの対応していない環境もあり、Vorbisはほとんど再生できません。VP8はそもそもMP4で有効になりません。そのため、映像・音声ともH.264 + AACに再エンコードするのが安全な既定です。これで大半のプレーヤー・端末で再生できます(ただしプロファイル・レベル・ピクセルフォーマット・端末側の制限が影響することはあり、必ず再生できるわけではありません)。
2. ほぼすべてのWebMに使える1コマンド
基本のコマンドです。映像をH.264、音声をAACに再エンコードし、Webでそのまま再生できる形にします。
ffmpeg -i input.webm -c:v libx264 -crf 23 -c:a aac -b:a 128k -movflags +faststart output.mp4
-c:v libx264… 映像をH.264でエンコード(最も互換性の高いコーデック)-crf 23… 一定品質の目標値。小さいほど高画質・大容量-c:a aac -b:a 128k… 音声を128kbpsのAACに再エンコード-movflags +faststart… moovアトムを先頭へ移動し、ダウンロード完了前に再生開始できるようにする
この1行で、VP8・VP9・Opus・Vorbisのどの入力も同じように処理できます。ただし10bitのVP9(プロファイル2)のWebMなら、-pix_fmt yuv420p を付けてください。付けないとMP4も10bitのH.264(High 10)になり、再生できない機器が多くなります。
3. CRF値の選び方(画質と容量)
画質と容量は、主にCRF(Constant Rate Factor/固定品質係数)で調整します。CRFは見た目の品質を一定に保つように、ビットレートを変動させます。
| CRF | 画質 | 主な用途 | 容量 |
|---|---|---|---|
| 18 | 視覚的にロスレス | アーカイブ・マスター | 大 |
| 20 | 非常に良い | 高画質アップロード | 中〜大 |
| 23 | とても良い(既定) | 汎用 | 中 |
| 26 | 良い | Webプレビュー・下書き | 小 |
| 28 | 許容範囲 | 簡易共有・容量節約 | 最小 |
CRFを±6変えると、おおむね容量が半分または倍になります。まず23から始めて調整してください。
ffmpeg -i input.webm -c:v libx264 -crf 20 -preset slow -c:a aac -b:a 192k -movflags +faststart output.mp4
-preset slow はエンコードに時間がかかる代わりに、圧縮効率が上がります。
4. VP9はストリームコピーでき、VP8はできない
MP4には仕様上VP9映像を格納できます。再生側がMP4内のVP9に対応していれば、映像ストリームをコピーして、時間のかかる映像の再エンコードを省けます。
ffmpeg -i input.webm -c:v copy -c:a aac -b:a 128k -movflags +faststart output.mp4
VP9映像はそのまま(瞬時・無劣化で)保ち、音声だけをAACに再エンコードします。
注意点:
- この方法が使えるのはVP9(とAV1)だけです。VP8はMP4で有効な映像コーデックではなく、コピーしようとするとFFmpegが
Could not find tag for codec vp8というエラーで止まります(第7節のエラー2)。 - 多くの再生環境(古いiPhone、一部のスマートTV、Premiere Pro)は、コンテナ仕様上は許可されていてもMP4内のVP9に対応していません。互換性が目的なら、第2節のコマンドでH.264に再エンコードしてください。
判断の前に、WebMが実際にどのコーデックを使っているかを確認します。
ffprobe -hide_banner input.webm
Video: vp8 と表示されたら映像の再エンコードが必須です。Video: vp9 で再生側が対応していれば -c:v copy も選択肢になります。
5. 音声:Opus/VorbisをAACへ
WebMの音声は、ほとんどがOpus(新しい)かVorbis(古い)です。MP4内のOpusは対応していない再生環境があり、Vorbisはほとんど再生できないため、AACに再エンコードします。
ffmpeg -i input.webm -c:v libx264 -crf 23 -c:a aac -b:a 192k -ar 48000 -movflags +faststart output.mp4
-b:a 192k… 音楽中心の素材向けに高めの音声ビットレート(音声中心なら128kで十分)-ar 48000… 48kHzにリサンプリング。動画で一般的かつ安全なサンプルレート
音声トラックが元々ない場合、FFmpegは映像のみのMP4を生成し、-c:a オプションは無視されます。
6. エンコードを高速化する
H.264のエンコード速度は -preset で制御します。速いプリセットほど早く終わりますが、圧縮効率は下がります。同じCRFでも画質と容量はプリセットによって変わり、遅いプリセットで必ず小さくなるとは限りません。
| プリセット | 速度 | 圧縮効率 |
|---|---|---|
| ultrafast | 最速 | 最低 |
| veryfast | 速い | 低め |
| medium | 既定 | 基準 |
| slow | 遅い | 高め |
| veryslow | 最遅 | 最高 |
手早く「十分な品質」で変換したい場合:
ffmpeg -i input.webm -c:v libx264 -crf 23 -preset veryfast -c:a aac -b:a 128k -movflags +faststart output.mp4
時間より画質を優先するアーカイブ用マスターなら、低めのCRFと -preset slow または -preset veryslow を使います。
7. トラブルシューティング
エラー1: VLCでは再生できるがスマホで再生できない
原因: VP9をストリームコピー(-c:v copy)しましたが、スマホがMP4内のVP9に対応していません。
解決策: 第2節のコマンドでH.264に再エンコードします。
エラー2: Could not find tag for codec vp8 in stream
原因: VP8のWebMに -c:v copy を使いました。VP8はMP4コンテナに入れられません。
解決策: 映像を再エンコードします。-c:v copy の代わりに -c:v libx264 を使います。
エラー3: 変換後に音が出ない
原因: -c:a copy で音声をOpus/Vorbisのまま残しています。MP4内のOpus/Vorbisに対応していないプレーヤーでは音が出ません。
解決策: -c:a aac -b:a 128k で音声を再エンコードします。
エラー4: オンラインで再生開始までに時間がかかる
原因: moovアトムがファイル末尾にあります。
解決策: -movflags +faststart を付けます(上記のコマンドにはすべて含まれています)。
エラー5: 色がやや薄く見える
原因: 一部のキャプチャでは色情報が引き継がれません。
解決策: 標準的なHDの色空間(BT.709)であることを示すタグを付けます。setparams はタグを書き込むだけで、映像の画素は変えません。
ffmpeg -i input.webm -vf "setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709" -c:v libx264 -crf 20 -c:a aac -b:a 128k -movflags +faststart output.mp4
出力オプションの -colorspace bt709 -color_primaries bt709 -color_trc bt709 を使う方法もよく紹介されていますが、FFmpeg 8.1 では色空間のタグしか付きません。さらに、元の映像を BT.601 とみなして画素を変換するので、色が少し変わります。
よくある質問
Q1. WebMからMP4への変換で画質は落ちますか。
A. 再エンコード(H.264)は非可逆なので劣化します。CRF 18〜23なら劣化はわずかで、通常は見て分かりません。-c:v copy でVP9をストリームコピーすれば映像はビット単位で同一で、変わるのは再エンコードされる音声だけです。
Q2. VP9のままにすべきか、H.264にすべきか。 A. 互換性(スマホ・編集ソフト・TV)を最優先するならH.264です。視聴者が最新のブラウザだけならVP9の方が効率的ですが、その場合はWebMのまま使うほうが合理的です。
Q3. WebMに音声がありません。コマンドは失敗しますか。 A. しません。FFmpegは映像のみのMP4を生成し、使われない音声オプションは無視されます。
Q4. AAC音声のビットレートはどれくらいが良いですか。 A. 音声中心や一般的な素材なら、128kで元の音と聞き分けにくい品質になります。音楽中心なら192kをおすすめします。ステレオAACでは、256kを超えてもほとんど効果はありません。
Q5. 画面録画のWebMも同じ方法でMP4化できますか。 A. できます。ブラウザの画面録画は標準的なVP8/VP9 + OpusのWebMを出力するので、第2節のコマンドがそのまま使えます。
Q6. ざっくりプレビューだけ欲しい場合の高速な方法は。
A. -preset veryfast と、CRF 26程度の高めの値を使います。画質は少し下がりますが、処理は速く終わります。