モバイルエンジニアが H.265/HEVC 使った方がいい理由(わけ)

こんにちは。モバイルエンジニアの@daisukefujiです。

少し前になりますが、WWDC 2017 にてH.265/high-efficiency video coding(HEVC) のサポートが発表されました。 iOS デベロッパーの方はご存知だと思いますが App Store審査ガイドライン に以下のビデオストリーミングコンテンツについての規定があります。

2.5.7 携帯電話ネットワークを介した10分以上のビデオストリーミングコンテンツにはHTTP Live Streamingを使用し、ベースラインの192 kbpsのHTTPライブストリーミングを含める必要があります。

ここで唐突に「ベースライン」という用語が使われていますが、これは「H.264 Baseline profile」もしくは「MPEG-4 Part 10 Advanced Video Coding の Baseline profile」というビデオコーデックを指しています。 名称が2つあるのは ITU-TISO/IEC という団体が共同で策定したものをそれぞれで名称をつけているためです。

Android アプリには同様のガイドラインがないのですが Apple のこの規約のためマルチプラットフォームでビデオストリーミングコンテンツを使用するサービスは HTTP Live Streaming と H.264/AVC Baseline profile を避けて通れず、スタディサプリでも採用しています。

そこで、H.264/AVC に加え H.265/HEVC を新たにサポートすべきか検証してみました。

結論

  • H.265/HEVC をサポートした方が良い。(※ただし AOMedia Video 1 コーデックの仕様が策定され、各ブラウザでのサポートも進んでいるで判断が難しい)
  • H.264/AVC のとき92 MB あった動画ファイルが映像のほぼ劣化なく37 MBになった。半分以下!
  • H.264/AVC のとき3 分であったエンコード時間が8 分(+5 分)になったが許容範囲。

概要

以下のような動画を H.264/AVC Baseline profile と H.265/HEVC Main profile でエンコードしてみました。 解像度を 1280x720 に設定しているのはサービスで提供してる最大解像度が 720p のためです。

高3 スタンダードレベル英語~文法編~

H.264/AVC

ffmpeg -i original_1080p.mp4 -an -c:v libx264 -profile:v baseline -level 3.0 -filter_complex scale=1280:720:flags=spline -f mp4 resized_264_baseline.mp4

H.265/HEVC

ffmpeg -i original_1080p.mp4 -an -c:v libx265 -filter_complex scale=1280:720:flags=spline -f mp4 resized_265.mp4

映像の品質評価

映像を目で見て品質を評価するのは難しいので VMAF を使い、定量的に品質を比較しました。 ※ ffmpeg@8c20ea8ee0f3f0b27aca0204c6dfaa4ac137e34eVMAF v1.3.4 を使いました。

H.264/AVC の VMAF スコア

VMAF score: 91.250442

ffmpeg -i resized_264_baseline.mp4 -i original_1080p.mp4 -filter_complex "scale=1920:1080:flags=lanczos,libvmaf" -an -f null –

H.265/HEVC の VMAF スコア

VMAF score: 86.358011

ffmpeg -i resized_265.mp4 -i original_1080p.mp4 -filter_complex "scale=1920:1080:flags=lanczos,libvmaf" -an -f null –

VMAF スコアの比較

引用元

最終的な品質評価になる VMAF スコアは 100 が最高画質。配信向けには 80 程度を目標とするビットレートになるようにする。

約 4.9 ほどスコアに差がありますが、80 を大きく上回っているので十分にきれいな画質でした。

なぜこのような結果になったのか考察

H.265/HEVC は H.264/AVC と比べ50〜75 %の圧縮率を実現するといわれていますが、今回の検証では半分以下になりました。 そこで、なぜこのような結果になったのか考察したいと思います。

我々の学習動画は以下の特徴があります。

  • シーンの切り替わりが少ない
  • 動きが少ない
  • 背景がほぼ単一色(背景のほとんどが黒板のため)
  • ほぼすべての学習動画ファイルで同じ特徴を持つ

なぜ H.265/HEVC の圧縮率が、H.264/AVC よりも高いのか

引用元

ブロックサイズの最適化技術により、圧縮率を高くすることができます。動画像の場合、画面全体を細かく分割(ブロック化)して、変化した情報のみを送ります。 「H.264」は、細かいブロックで変化分のみを送りますが、変化が少ないブロックも大きく複雑化したブロックも、同じ細かいブロックで送っていました。 「H.265は、変化量の大きさによって、ブロックを最適化します。つまり、変化の少なく簡単なブロックは大きいブロックにし、複雑な変化のあるブロックは小さいブロックにします。すると、全体の情報量が削減できます。

我々の学習動画は変化の少ない大きなブロックを作りやすいため、H.265/HEVC のブロック最適化の効果が高いと推察しました。