HEVC(H.265)は容量を節約できますが、再生できない場面が多い形式です。古いテレビやメディアプレーヤー、一部の動画編集ソフト、HEVCコーデックが入っていないWindowsなどで起こります。解決策は、映像ストリームをH.264(libx264)に再エンコードすることです。H.264は最も幅広く対応されているコーデックです。

エンコード中に libx265/hvc1 のエラーが出ている場合は、互換性のための変換とは別の問題です。FFmpeg H.265/HEVCエラー対策を参照してください。

1. なぜHEVCをH.264に変換するのか

HEVCはH.264より効率的で、保存には向いています。「同じ画質で40〜50%小さい」とよく言われますが、当サイトで VMAF を揃えて実測したところ 26〜35% でした(実測データ)。素材や設定で変わるものの、よく引用される数字は楽観的です。問題はデコード対応の広さです。

再生環境 HEVC (H.265) H.264
古いテレビ・メディアプレーヤー 非対応が多い ほぼ確実に再生可
Windows(HEVCコーデック無し) 「再生できない」/映像が出ない 標準で再生可
古い動画編集ソフト 読み込み失敗・プレビュー不可 問題なく読込
旧ブラウザの <video> 不安定 ほぼ全対応
5年以上前のスマホ 機種次第 安定

どこでも確実に再生したいなら、H.264が安全です。欠点は、変換が再エンコードになること(不可逆で、CPU時間がかかる)と、H.264ファイルは元のHEVCより大きくなりやすいことです。

この変換は -c:v copy ではできません。コピーはコンテナを変えるだけで、コーデックは変わりません。HEVC → H.264 が必ず再エンコードになる理由はコピー vs 再エンコードを参照してください。

2. 基本の変換コマンド

標準的な8bit HEVCファイルなら、次のコマンドで変換できます。

ffmpeg -i input.mp4 -c:v libx264 -crf 20 -preset medium -c:a aac output.mp4
  • -c:v libx264 … 映像をH.264でエンコード
  • -crf 20 … 一定品質の目標値(低いほど高画質・大容量)
  • -preset medium … エンコード速度と圧縮率のバランス
  • -c:a aac … 音声をAACに再エンコード(互換性が高い)

-crf 20 なら、ほとんどの素材で元の映像と区別が難しい画質になります。出力コンテナは .mp4 のままにします。古いプレーヤーが想定している形式です。

3. CRF — 画質と容量

CRF(Constant Rate Factor)は、画質と容量を決める主な設定です。libx264は0〜51を受け付け、低い数値ほど高画質・大容量になります。

CRF 見た目 用途の目安
18 ほぼ無劣化に見える アーカイブ・大画面
20 非常に良好、区別が難しい 推奨デフォルト
23 良好(libx264の既定値) 一般的な共有
26 細部がやや甘くなる 小容量・短いクリップ
28 圧縮が見て分かる 容量を強く削りたい時

CRFを数ポイント変えると、ファイルサイズと画質ははっきり変わります。ただし変化の比率は素材次第で、「Xポイントで半分」といった決まった法則はありません。画質ではなく目標のファイルサイズで指定したい場合は、2パスエンコードを使ってください(2パスエンコード)。とにかく小さくしたい場合は、CRF・スケール・ビットレートをまとめて扱う動画を圧縮するを参照してください。

4. preset — 速度と圧縮率

-preset はエンコーダの作業量を決めます。遅いpresetほど圧縮効率は上がりますが、時間がかかります。見た目の画質の目標を決めるのはCRFで、presetではありません。

preset 速度 圧縮効率
ultrafast 最速 最低
veryfast 速い 低め
medium 既定 基準
slow 遅い 高め
veryslow 最遅 最高

時間に余裕があれば、-preset slow で圧縮効率を上げられます。ただし同じCRFのままだと画質も少し変わるので、容量が必ず減るとは限りません。早く済ませたいなら medium で十分です。

5. 10bit HEVCの落とし穴(8bit yuv420pを強制)

スマホ・カメラ・HDR由来のHEVCには10bit(yuv420p10le)のものが多くあります。これをそのままlibx264に渡すと、出力が High 10 プロファイルのH.264になることがあります。そうなると、再生したかった古いプレーヤーでデコードできません。互換性を優先するなら、標準の8bit yuv420p を強制してください。

ffmpeg -i input.mp4 -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a aac output.mp4
  • -pix_fmt yuv420p … 8bit 4:2:0 を強制(もっとも広く対応された画素形式)

これが最も安全なコマンドです。変換後のファイルが古い機器で「音は出るのに映像が真っ黒・乱れる」場合は、-pix_fmt yuv420p の付け忘れがよくある原因です。

HDRについての注意: 10bitのHDRソースを8bitの yuv420p に変換しても、変わるのはビット深度だけです。HDRからSDRへのトーンマッピングは行われません。そのため、色がくすんだり不自然に見えたりすることがあります。ソースがHDRで、正しいSDRの色にしたい場合はトーンマッピングが必要です。HDRをSDRに変換するを参照してください。

6. 音声はそのまま残す

元の音声がすでにAAC(HEVCのMP4ではよくある形式)なら、再エンコードは不要です。コピーすれば時間を節約でき、2回目の不可逆圧縮も避けられます。

ffmpeg -i input.mp4 -c:v libx264 -crf 20 -c:a copy output.mp4
  • -c:a copy … 音声ストリームをそのままコピー(瞬時・無劣化)

プレーヤーが音声を再生できない場合(DTSやOpusなど、珍しい形式がMP4に入っている場合など)は、-c:a aac に戻してください。

7. トラブルシューティング

古いテレビ・プレーヤーで映像が真っ黒・乱れる

原因: 出力が10bit(High 10 プロファイル)のH.264になっている。 解決策: -pix_fmt yuv420p を追加して8bitを強制します(第5節)。

変換が異常に遅い

原因: 長い・高解像度のファイルに遅いpresetを使っている。 解決策: -preset medium か -preset veryfast を使います。ソフトウェアのH.264エンコードはCPUで処理するため、ある程度遅いのは想定内です。

元のHEVCより容量が大きくなった

原因: 正常です。H.264はHEVCより効率が劣ります。 解決策: CRFを上げる(例 -crf 23)か、解像度を下げます。動画を圧縮するを参照してください。

変換後に音声が消えた

原因: 元の音声が、プレーヤーの対応していない形式(DTSやOpusなど)のままコピーされた。MP4に入れられない形式の場合は、音声が消えるのではなく Could not find tag for codec ... というエラーで変換が失敗します。 解決策: -c:a copy ではなく -c:a aac で再エンコードします。どちらの場合もこれで直ります。

これをやってもiPhoneのHEVCがWindowsで再生できない

原因: 映像形式とは別の問題です。転送が途中で終わっている、元の動画自体が壊れている、再生アプリ側に原因がある、などが考えられます。 解決策: iPhone動画をWindowsで再生するを参照してください。

よくある質問

Q1. HEVCからH.264への変換で画質は落ちる? A. 落ちます。不可逆な再エンコードだからです。-crf 18〜20 なら劣化はほぼ分かりませんが、無劣化ではありません。コンテナだけを変えるリムックス(-c copy)では、コーデックは変えられません。

Q2. H.264ファイルはHEVCより大きくなる? A. たいてい大きくなります。H.264は同じ画質を出すのに、より多くのビットが必要です。互換性と引き換えに容量が増えます。

Q3. CRFはいくつにすべき? A. まず -crf 20 で試してください。保存用に画質を上げたいなら18、容量を小さくしたいなら23〜26にします。

Q4. 自分のファイルが10bitか確認するには? A. ffprobe input.mp4 を実行し、映像ストリーム行に yuv420p10le があるかを確認します。あれば第5節の -pix_fmt yuv420p 付きのコマンドを使ってください。

Q5. HEVCのまま、より多くの機器で再生できるようにできる? A. Apple機器では、hvc1 タグを付けると改善することがあります。ただし古いプレーヤーで確実に再生するには、H.264への変換が必要です。FFmpeg H.265/HEVCエラー対策を参照してください。

関連記事