HEVC(H.265)は容量を節約できますが、再生できない場面が意外と多い形式です。古いテレビやメディアプレーヤー、一部の動画編集ソフト、そしてHEVCコーデックが入っていないWindows環境などで「再生できない」が起こります。解決策は映像ストリームをH.264(libx264)に再エンコードすること。H.264はもっとも幅広く対応されたコーデックです。本記事では正確なコマンド、画質と容量のトレードオフ、多くの人がハマる10bitの落とし穴まで解説します。所要時間:10分。

動作確認: FFmpeg 8.1

これは特定のエラーメッセージへの対処とは別物です。エンコード中に libx265hvc1 のエラーが出ている場合はFFmpeg H.265/HEVCエラー対策を参照してください。本記事は、互換性のためにHEVCをあえてH.264へ「ダウングレード」する話です。


この記事でわかること

  1. なぜH.264はHEVCより広く再生できるのか
  2. HEVC → H.264 の基本1行コマンド
  3. CRFで画質と容量を調整する方法
  4. -preset で速度と圧縮率を調整する方法
  5. 10bit HEVCの落とし穴(yuv420p での対策)
  6. 元の音声をそのまま保持する方法
  7. トラブルシューティング
  8. よくある質問

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

HEVCはH.264より効率的なことが多く(同じ画質で約30〜50%小さくなるとよく言われますが、素材や設定によって変わります)、保存には向いています。問題はデコード対応の広さです。

再生環境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速度同じCRFでの容量
ultrafast最速最大
veryfast速い大きめ
medium既定基準
slow遅い小さい
veryslow最遅最小

時間に余裕があれば -preset slow は容量面で「タダで得する」設定です。サッと済ませたいなら medium で十分です。


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

スマホ・カメラ・HDR由来のHEVCには10bityuv420p10le)のものが多くあります。これをそのまま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 を使う。エンコードはCPU依存で、ソフトウェアH.264では想定内です。

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

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

変換後に音声が消えた

原因: 元の音声がMP4コンテナやプレーヤーの非対応形式だった。 解決策: -c:a copy ではなく -c:a aac で再エンコードする。

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

原因: iPhone映像特有のメタデータ・回転の別問題。 解決策: iPhone動画をWindowsで再生するを参照。


よくある質問

Q1. HEVCからH.264への変換で画質は落ちる? A. 落ちます——不可逆な再エンコードです。-crf 1820 なら劣化はほぼ分かりませんが無劣化ではありません。コンテナだけのリムックス(-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エラー対策参照。


関連記事


Tested with FFmpeg 8.1 — verified with our command-check script 一次ソース: ffmpeg.org/ffmpeg.html / trac.ffmpeg.org/wiki/Encode/H.264