意外と多かった疑問に、「グラボを利用したエンコードはなぜ配信画質が下がってしまうのか」について今回は掘り下げていこうと思います。もちろん詳しくすればするほどかなり難しい内容になってしまうので、なるべく簡単にするよう頑張ります。ただ、前条件として配信がどういった仕組みを利用して行われているか、などを知る必要があります。最終的に、グラボを利用したエンコードで配信がなぜ画質が落ちてしまうのか、に集約していきますので、どうぞ最後までお付き合いください。
配信画質はなぜ変化するのか
解説を始める前に、まずはこちらをご覧ください。英語ですが字幕が設定されています。
これはストリーミングで動画を配信するのに、どんな技術が使われていて、どんなことに弱いのか、ということがよくわかります。先日の記事にも紹介しましたが、OBSの開発者ブログの解説記事も再掲しておきます。
基本的にはこちらの翻訳を読めばある程度理解できると思いますが、いくつか解説が必要な部分を感じますので、今回はこちらの記事をかみ砕いて解説する、という形で行こうと思います。
動画と画質についてまずは確認
まず「動画」というのはそもそも何かということを説明すると、「写真を連続で投影し続けたもの」と言えると思います。パラパラ漫画をイメージしてもらったら、あれを写真でやっているものが「動画」になっていると考えてよいです。
ですから、まずは一枚の写真サイズから考えてみます。
フルHD画質の写真一枚のデータのサイズを考えてみましょう。まず1920×1080(フルHD)の場合、およそ200万画素(ピクセル)の情報が必要です。そしてこのピクセルに色情報が与えられます。この色情報の詳しさを「bit」という単位で決定しています。24bitの場合、最大16,777,216(1677万くらい)の情報を割り振ることが可能です。これを単純に掛け算していくと、一枚あたり6MBは最低必要になります。
これを毎秒30枚(フレーム)表示すると180MBのデータが毎秒処理されます。これをインターネットの速度に変換すると、1.4Gbpsの実速が必要になる計算です。先ほどの動画では24フレームで計算していて、その場合1.1Gbpsの実速が必要になる、ということです。
この環境を持っている人は世界でもそんなに多くないですし、もしこの転送を全国で行ったらインターネット会社は確実にパンクします。そこで「圧縮」を行うことで、サイズを軽減しているのです。この圧縮のことをエンコードと呼んでいます。正確にはエンコードは「信号やデータを一定の規則に基づいて変換すること」で暗号化なども含みますが、動画におけるエンコードは、圧縮と同意であると思ってよいです。
圧縮の仕組み
圧縮には大きく二つの仕組みがあります。画像圧縮とフレーム間圧縮で、それぞれ説明していきます。
①画像圧縮
まず画像圧縮ですが、見ても気づかない小さなビット情報を削除することで、一枚あたりのデータを軽くする、というものになります。つまり写真一枚に必要な情報を絞る、という作業を行っています。
②フレーム間圧縮
次にフレーム間圧縮です。フレーム間圧縮とは、次のフレーム(写真)に移るときに、違いが出た部分の情報を中心に伝える、という仕組みでサイズを軽減する圧縮です。
アニメを例にすると、アニメは背景のレイヤー(層)とキャラクターなど動きのあるレイヤー(層)に分けて作られます。背景はそんなに変わるものではないので、一枚の大きな背景を作り、その範囲内でキャラクターなどを動かすことでアニメはつくられています。
フレーム間圧縮は、動画をアニメのようにレイヤーで分けて処理しています。背景のレイヤーと、動きのある部分のレイヤーに分けて、動いた部分のデータだけを送れば、動いていない背景部分のデータ量をカットできる、という仕組みの圧縮になります。この動いている部分の情報のことを、「差分データ」と呼びます。
本当はこれ以外にも様々な処理がありますが、差分データでやり取りをすることで転送量を少なくしている、ということを理解してもらえれば大丈夫です。
動画の画質とビットレートの関係
ビットレートとは、単純に一秒あたりにどれくらいのデータを送れるか、という単位になります。先ほどのビデオで雪や紙吹雪が増えるほど画質も下がるし、コマ落ちしているのも確認できたと思います。これはビットレート、つまり一秒間に送れるデータ量以上に、差分ファイル(動き)が出てしまっているために起こってしまう現象です。
ですから動くものが多い動画ほど、差分ファイルが大きくなってしまうので、高いビットレートを確保しなければいけません。このビットレートを確保できない場合、もとの画質を下げる、フレーム数を少なくする、などによって一秒あたりの必要データ量を絞る必要があります。
ですから、全く同じ機材で配信をするとしても、映し出すものが変われば、最適な設定は変化してしまう、ということが言えます。
配信を行う上での設定
ここからビットレートと配信する映像の内容によって、どれくらいの圧縮を行うかなどを決定していくわけですが、この細かい設定をいちいちやってられません。そこであらかじめお勧めの設定を配信ソフトで用意しています。これをプリセット(前もって調整された設定)と言います。
配信でよく使われているOBS Studioには、「ツール」メニューにある「自動構成ウィザード」と呼ばれる機能があります。このツールは、システムとインターネット接続をテストして、エンコーディングの観点と接続の安定性の両方の観点から、システムが何を処理できるかを判断し、おすすめのプリセットを適用してくれる機能です。
つまりネットの速度と、PCの処理能力から、だいたいこれくらいまでは平均的に可能だよ、という設定をしてくれるのです。便利ですが、この設定から撮影する対象によって、設定を変更しないといけないことも勿論あります。
自分で配信の設定を決める場合、まず一番最初に決定するべきは画質、その次にビットレートになります。だいたい有効ネット速度の75%以下が目安です。このビットレートから逆算して、フレーム数や画質をある程度決定でき、それを自動でやってくれるのがOBS「自動構成ウィザード」という感じです。
そしていよいよ本題のエンコード(動画圧縮)をどの方法で行うか、というポイントへ進もうと思います。
エンコードのタイプとグラボ
配信でのエンコードタイプを比較する上で、とくに大事なのがエンコードする速度です。すごく極端な例ですが、1秒の動画データをエンコードするのに、1秒以上かかってしまうなら、配信を続けてみることはできないのは当たり前です。ですからエンコーダーの選び方も、環境によって当然変わってくるのです。
例えば、ブルーレイやDVDなどのメディアに記録する用の圧縮は、時間がかかってもなるべく高画質になるように、エンコーダーを選び設定します。
配信の場合は、リアルタイムとの遅延がなるべく少なくなるように設定しなければいけないので、エンコード速度がまず何より優先され、かつ差分データがビットレート内でやり取りできるデータサイズでなければならない、となります。
さてここでGPUメーカーで有名なNVIDIAのページを見ていただきたいのですが
冒頭に
「最高のストリーミング品質を実現するために、Twitch や YouTube の人気ブロードキャスターは、高性能 PC 1 台をゲーム専用とし、2 台目の高性能 PC を高品質 CPU ソフトウェア エンコーディング用として使用しています。」
とあります。そしてもう少し下の方に
「GeForce RTX GPU で x264 Fast より極めて高画質で、x264 Medium と同等に配信できることを意味します。」
と記載しています。NVIDIA自身が、配信ではCPUエンコードのx264 Mediumが高画質であることを前提に比較を行っています。この理由についてはOBS開発者ブログで以下のように述べられています。
ビデオエンコーディングは、特にリアルタイムで実行しようとする場合、非常に多くのリソースを消費するプロセスであることを理解することが重要です。Nvidia NVENC、Intel QuickSync、AMD VCEなどのハードウェアエンコーダーは、ビデオエンコーディングのタスク専用のシステムで特別なハードウェアを使用するため、これに役立ちます。トレードオフとして、ビットレートあたりの全体的な品質は、ほとんどすべての場合でCPUベースのx264よりも低くなります。通常ビットレートが制約要因であるストリーミングの場合、x264は現在、ストリームから最高の品質を引き出すための最良のオプションです。
~~中略~~
基本的な考え方は、すべてが等しい(同じビットレートなど)場合、CPU使用量が少ないと品質が低下し、CPU使用量が多いと品質が向上するということです。これは、プリセットがエンコーダーが各フレームの圧縮に費やす時間を変更するためです。設定制約内で見栄えがします。
つまり、CPUのパワーが足りないときはグラボにエンコードを任せることが可能。だがグラボにデータを転送し処理を行い、データを返す時間を考えたら、CPUだけでできるならCPUでやる方がいいということです。配信はリアルタイムで処理を行うため、グラボに送って処理をさせる時間をCPUでの圧縮時間に回した方が、圧縮がうまくいく、用意できる差分データが詳細になるということです。
これがグラボを利用して配信すると、画質が下がってしまうという理由です。
と私は理解しているのですが、これを詳しく日本語で解説したものが今のところ見つかっていないので、ある程度の個人的推測になります。もし間違っている、本当はこうだ!という博識な方がいらっしゃれば、ぜひご教授願いたい。
ただこちらの推測には、ある程度の根拠もあります。NVENCというNVIDIAのハードウェアエンコード機能が去年アップデートされました。旧来との大きな変更点に「メインメモリーを経由せずにGPUとVRAMのやり取りだけでエンコード作業を行なえる」という点があります。データの受け渡し回数を減らすことでパフォーマンスを上げているので、おそらくそんなに的外れな推測でもないと思います。
グラボは本当に無意味なのか
2PC配信、配信専用にできるマシンがあるなら、そのCPUが十分に高性能であれば配信にグラボは必要ない、CPUでエンコードしたほうが高画質だ、とグラボメーカーも配信ソフト開発者も言っているよ、ということを今回は確認した感じです。
ただ、NVIDIAもOBSのスポンサーに付いて、連携開発を行っています。そう遠くない将来、配信機にもグラボを使った方が高画質に配信できるようになる可能性は、十分にあり得ると思います。そして、新しくなったNVENCは、ゲームPC1台でもかなり良い画質で配信が可能にもなってきています。ただ、やはり重いゲームをPC一台で高画質の録画配信をしようとすると、処理落ちしてしまうゲームもまだまだあります。
ですが現在のコロナの影響で動画を見る人も、配信する人も増加傾向にありますから、グラボも配信に機能を特化させた商品開発が早まるかもしれないです。配信環境が変化したら、また改めて記事を書いていきたいと思います。
まとめ
今回は配信とグラボの意外な関係について話をまとめましたが、配信環境はちょうど過渡期でもあると思っています。それは回線速度の上昇傾向が著しいことが理由にあります。現在、1G~2Gくらいの回線は(実速度はともかく)もう普通になってきています。10G回線も一般提供が始まっています。スマホなどの移動通信網も5G提供が始まり、これに合わせてストリーミング環境も大きく変わる可能性があります。
ですからなおさら、いま配信機を考えている人はCPUに全振りしたスペックで、グラボは搭載しないほうが良いと思います。配信にもっと特化した機能を付けた、新商品・新タイプのグラボが出る可能性もあるためです。もしそういった商品が出たら、また考察記事を書いていきたいと思います。