bitA Tech Blog
🎬

動画コーデックについての調査と検証

に公開

✨ 本記事はbitA Tech Blog Advent Calendar 4日目の記事です。

最近私は動画配信システムの開発に携わっています。動画配信システムを改善するためのアイディアが何かないかと思い、動画コーデックに関して色々調べて検証したので、その結果をこちらに残しておきたいと思います。少しでも誰かの役に立つ情報があれば大変嬉しいです!

動画コーデックとは?

動画データをエンコード, デコードするアルゴリズムのことです。
コーデックによって圧縮率が変わってきます。
圧縮率が違うことで、動画データをインターネットで転送する時に使用される帯域幅が変わってきます。
現在主に使用されているコーデックは、H.264です。H.264は2003年にできたコーデックでかなり古いのですが、いまだに広く使用されていることは驚きです。

2つのデコードの仕方

サーバーから送られてきた動画データはエンコードされています。エンコードされたデータをデコードすることで、動画を再生することができます。その際には、ソフトウェアレイヤーでデコードする仕組みと、専用のハードウェアを使用してハードウェアレイヤーでデコードするという2つの選択肢があります。ハードウェアデコードはソフトウェアデコードよりも、デコードの実行速度が速いですが、デコードを行うための専用のハードウェアが必要になります。

動画コーデックの種類

H.264の他にも、H.265, AV1などのコーデックが存在しています。

H.265

H.265はH264から10年後の2013年にリリースされたコーデックで、H.264よりもデータの圧縮率に優れています。
H.264よりも2倍の圧縮率を達成することができるようです。

しかし、いまだにH.264が広く利用されています。
H.265の普及を妨げているのが、特許の問題です。こちらのリンクの記事に細かく記載されているので興味のある方は読んでみてください。

H.265/HEVCコーデックの利用者は 少なくとも4つの特許プール・企業と個別に契約し、それぞれに対して特許使用料を支払う 必要があることを意味します。また、明らかに関連特許を保持していると考えられるものの、現時点では権利行使の態度を明らかにしていない企業も存在します。

H.265を使用する場合には、特許使用料を払う必要がある可能性があり、これがH.265の普及を妨げています。

AV1

AV1は2018年にリリースされたコーデックで、さらにH.265よりも30%の圧縮率が向上しているとされています。
しかも、ロイヤリティフリーであるため、H.265の特許の問題に頭を悩ませる必要がありません。(将来的にもしかしたら、どこかの団体が特許を主張してくるかも的な不穏な空気は少しありますが....)

AV1は現時点では、理想的なコーデックであるようにこの説明を読むと感じるかも知れませんが、AV1もあまり普及が進んでいません。

AV1の場合は、ハードウェアデコードすることができるデバイスが不足していることが普及を妨げています。

こちらの記事は、2024年上半期に書かれたものであり、2024年の4月~6月においては、9.76%であるという結果になっています。増加率だと、2025年11月現在では、15%~20%ほど、2026年末には、20%~30%ほどの普及率になると予測できます。
この記事が集計したデータは、全世界のデータを対象に集計したものであるので、日本に限定するともう少し普及率は高くなることが予想できます。

こうしてみると、結局H.264を使用するのがいいのではと思えてきます。世の中のサービスはどんなコーデックを使用しているのか見てみましょう。
動画配信で最も有名なサービスはYouTubeですが、YouTubeはどのようなコーデックを使用しているのでしょうか?

YouTubeで使用されているコーデック

右クリックして詳細統計情報を押すと、動画がどのコーデックなのかがわかります。

私のPCはAV1のハードウェアデコードを行うことができるデバイスです。
このデバイスでYouTubeを視聴してみて、動画のコーデックを見てみました。
20個ほど動画のコーデックを適当に見てみましたが、全てAV1コーデックでした。
この結果から、最近アップロードされたYouTubeの動画はほぼAV1でエンコードされているものを用意しているということを推察できます。
これは私の推測なのですが、AV1を再生することができるだけのスペックを有しているデバイスであればAV1でエンコードされた動画を再生させ、そうでないデバイスに関しては、H.264などでエンコードされた動画を再生させるような仕組みにしているのではないかと思われます。

一つの動画に対して、複数のコーデックでエンコードされた動画を用意することは、より費用がかかりますし、システムの複雑性も増します。しかし、YouTubeは莫大な量の動画を転送しているため、AV1などの圧縮率の高いコーデックを使用することによるデータ転送量の低下の恩恵が、諸々の費用を上回っているのでしょう。

日本国内では、DMM TVがAV1コーデックでも配信をしているようです。

いろいろ知識は溜まったので、実際に自分の手を動かしてAV1を検証してみたいと思います。

AWS mediaConvertでAV1コーデックを試す

ffmpegでもh264 codecの動画をAV1 codecに変換することはできますが、今回はAWS mediaConvertを使用します。

手順はシンプルで

  1. S3に元動画となるh264 codecのmp4ファイルをアップロード
  2. 1でアップロードした動画をmediaConvertの入力として設定
  3. 出力グループのエンコード設定をする際に、ビデオコーデックとして、AV1を選択

重要な細かい設定としてはレート制御モードがあり、今回はQVBRを使用しました。最大ビットレートは2mbps、QVBR品質レベルは自動にしました。

検証用の動画として、お馴染みのBig Buck Bunnyを使用しました。
ダウンロード元
元動画は長いので、30s~60sの部分を切り出し検証しました。

元ファイルのサイズが9.0MBだったのですが、AV1変換後のファイルサイズが3.75MBでした。半分以上ファイルサイズが減少しています。

ファイルサイズが減少した分、映像が劣化した可能性もあります。どれほど劣化したかを定量的に計測するためにVMAFという手法を使います。

VMAFによる定量評価

VMAFとは何か

VMAFを使用すると、動画がエンコードされる前と後でどれほど映像が劣化したかを定量的に計測することができます。

こちらのサイトによると、80以上であれば問題なく、それほど劣化はしていないということのようです。

Claudeに聞くと以下のような回答が返ってきました。

95-100: ほぼ完璧 - 元の動画との違いがほとんど知覚できない
90-95: 優秀 - 非常に高品質、ほとんどの視聴者が満足
85-90: 良好 - 高品質、わずかな劣化があるが許容範囲
75-85: 許容範囲 - 品質は良いが、注意深く見ると違いが分かる
60-75: まあまあ - 品質劣化が目立ち始める
60未満: 品質低下が顕著

VMAFはffmpegに組み込まれており、以下のようなコマンドでスコアを算出することができます。

ffmpeg -i target_av1.mp4 -i source_h264.mp4 \
  -lavfi "[0:v]setpts=PTS-STARTPTS[dist];[1:v]setpts=PTS-STARTPTS[ref];[dist][ref]libvmaf=log_fmt=json:log_path=vmaf_comparison_original.json:n_threads=8" \
  -f null -

結果としては、以下のようになりました。

最小: 77.86
最大: 95.03
平均: 88.52
調和平均: 88.39

平均88.52ということで人間の目ではあまり劣化を確認できない程度のスコアになりました。
VMAFスコア88、60%(3.75MB/9.0MB)の動画圧縮をしているという結果になりました。エンコード時のパラメーターなどは適当に設定したのにこのような結果を得られて結構満足しています。

今後について

動画配信の最適化をなんとかできないかということで、動画コーデックについて調べたり、検証したりしてみました。この経験を通じて得られた知識を業務などで生かしていければと思っています。

bitA Tech Blog
bitA Tech Blog

Discussion