
WebRTC 経由の画面共有に関して、さまざまなコーデックがどのように比較されるのか、ずっと興味がありました。そこで、最も一般的な 4 つのコーデックである VP8、VP9、H.264、AV1 をテストして、自分で調べてみることにしました。
結果が確実であることを確認するために、さまざまなコンテンツ タイプとネットワーク条件でテストを実行しました。視覚的な印象だけに頼るのではなく、フレームごとの比較を使用し、ピーク信号対雑音比 (PSNR) を計算し、詳細な WebRTC 統計を取得して、明確でデータに基づいたビューを取得しました。
さらに一歩進んで、エンコードとデコードの両方で CPU 使用率を追跡するカスタム Chrome プラグインも作成しました。これにより、各コーデックがシステム パフォーマンスにどのように影響するかを詳しく調べることができました。品質は素晴らしいですが、それに追いつこうとしてコンピューターが燃え尽きてしまうようでは意味がありません。
私は、ビットレート、フレーム レート、解像度、量子化 (QP)、PSNR、CPU 負荷などの主要な指標を調べました。それらすべてに基づいて、WebRTC 画面共有を独自のユースケースに合わせて最適化しようとしている人に役立つ実用的な推奨事項をいくつか考え出しました。
ビデオ通話中に画面を共有したときに、画質が低下したり、ビデオが途切れたりしたことに気づいたことがある人は、あなただけではありません。画面共有を鮮明かつスムーズに保つことは、実は思ったよりも難しいのです。
問題は、多様性です。コンテンツの中には、スライド デッキやドキュメントのように静止しているものもあります。また、動きの速いビデオを共有することもあります。これらの異なる種類のコンテンツは、コーデックにまったく異なるものを要求します。たとえば、動きの速いビデオは大量の帯域幅を消費しますが、静止画像は圧縮アーティファクトの影響を受けやすく、ぼやけたりブロック状に見えたりすることがあります。
パケット損失や帯域幅の低下など、実際のインターネットの問題が加わると、状況はさらに複雑になります。そのため、適切なコーデックを選択し、その動作を微調整することが、画面共有を高品質かつ応答性の高いものにするために非常に重要です。
一般的なストリーミング シナリオでビデオ コーデックがどのように機能するかについては、すでに多くの研究が行われています。しかし、画面共有には独特の癖があります。これは単にビデオを見るだけではなく、リアルタイムでやり取りすることであり、コンテンツの種類は多岐にわたります。つまり、通常の研究が必ずしも当てはまるとは限りません。
私はこの特定のユースケースをさらに深く掘り下げたいと考えました。私の目標は、特にさまざまなコンテンツ タイプや予測できないネットワーク状態などの現実世界の制約下で、画面共有に関してさまざまなコーデックがどのように機能するかを確認することでした。
そのために、私は画面共有の品質をできるだけ正確に評価する方法を設計しました。見た目だけではなく、確かな指標とデータに基づいて評価する方法です。その過程で、どのコーデックが最も優れているか、リアルタイム アプリケーションでパフォーマンスを向上させるために微調整する方法について多くのことを学びました。
すぐに明らかになったことが 1 つあります。画面共有のパフォーマンスは、共有する内容によって大きく左右されるということです。テンポの速いビデオの動作は、静的なドキュメントや Web ページのゆっくりとしたスクロールとはまったく異なります。
公平性と一貫性を保つために、すべてのテストがまったく同じ条件 (同じ解像度、同じ開始点、同じ期間) で実行されるようにしました。こうすることで、結果はすべてコーデックのパフォーマンスに関するものであり、偶発的な変数によるものではないと確信できました。
実際の画面共有状況をシミュレートするために、2 つの異なるテスト ケースを作成しました。
これら 2 種類のコンテンツを組み合わせることで、動きに対応することから、より静的なシーンでの鮮明さの維持まで、各コーデックがさまざまな課題にどのように対処するかをテストするのに適した組み合わせが得られました。
コーデックを適切にテストするには、送信内容と受信内容の両方をキャプチャできる堅牢なセットアップが必要でした。私はwebrtc-sandboxというツールから始めました (ちなみに、このツールとその他のツールについては、私の別の投稿「 WebRTC の実践学習: 最適なツールとデモ」で学べます)。これは、WebRTC の内部をいじるのに最適です。最終的には、画面共有をより適切に処理し、送信ビデオ ストリームと受信ビデオ ストリームの両方を記録できるように、かなり調整しました。テストを実行するたびに、送信内容と受信内容の 2 つのビデオ ファイルが作成され、後で並べて分析するために使用しました。
しかし、私はビデオだけに留まりませんでした。裏で何が起こっているかも追跡したかったのです。そのために、Chrome ブラウザから詳細な WebRTC 統計情報を直接取得しました。これらの統計情報から、各コーデックのパフォーマンスや、各テスト中のシミュレートされたネットワークの動作を把握することができました。
パズルの大きなピースの 1 つはCPU 使用率でしたが、これは少し難しいことがわかりました。Chrome の通常バージョンでは、プラグインが個々のタブの CPU 負荷を監視できないため、ブラウザの開発ビルドを使用して、これを回避するための独自のプラグインを作成しました。
私は特に、画面共有を送信または受信しているタブの CPU 使用率を測定することに焦点を当てました。こうすることで、ブラウザーの他の部分からの無関係なレンダリング タスクを除外しました。送信と受信の両方が同じタブで行われたため、取得した数値は組み合わせたビューでしたが、それでも実際の使用例で見られるものとかなり近いものでした。(ネタバレ: エンコードは通常、デコードよりも CPU に大きな負荷をかけます。)
セットアップの準備ができたら、実際の実験を実行する時間です。私は実験を何度も実行しました。ネットワーク条件とコーデック設定を変えて、同じマシンで何度もテストを繰り返し、結果を確認しました。合計で157 のデータ ポイントを収集し、テスト条件のあらゆる組み合わせが適切に表現されていることを確認しました。
これにより、作業に使用できる確実なデータセットが得られ、さまざまなシナリオで WebRTC の画面共有がどのように動作するかを詳細に分析できるようになりました。具体的にテストした内容は次のとおりです。
これらの変数を構造的に組み合わせることで、ビデオ通話、ライブ デモ、共同リモート セッションなどで発生するような、実際の画面共有シナリオを模倣することができました。
ほとんどの実験と同様に、最初の数回の実行は期待したほどスムーズにはいきませんでした。すぐに 2 つの大きな問題が発生しました。
これらの問題を解決するために、いくつかの重要な改善を加えました。
考慮する必要のあることがもう 1 つありました。WebRTCのアダプティブ ビットレートです。WebRTC の優れた機能の 1 つは、利用可能な帯域幅に基づいてビデオ品質を自動的に調整することです。ただし、この調整は即座に行われるわけではなく、安定するまでに数秒かかります。そのため、実際の録画を開始する前に短い遅延を追加しました。これにより、システムがターゲット ビットレートに落ち着く時間ができ、結果には、物事が安定した後に得られる実際の品質が反映されます。
これらの変更により、実験の信頼性が大幅に向上し、収集したデータが実際の画面共有の動作を反映していることに自信が持てるようになりました。
これらのテスト中に大量のデータを収集しましたが、わかりやすく比較しやすいように、画面共有シナリオで各コーデックがどのように機能するかを実際に示すいくつかの主要なメトリックに焦点を当てました。
私が調べたのは以下のものです:
これらの指標で細かく分析することで、品質だけでなく、スムーズさ、効率性、要求の厳しさについてもコーデックを比較することができました。これにより、実際の画面共有状況で各コーデックが優れている点と、劣っている点が明らかになりました。
私の実験から得られた最も驚くべき結果の 1 つは、共有するコンテンツの種類が、ビデオ品質とリソース使用量の両方の点で、画面共有のパフォーマンスにどれほど影響を与えるかということでした。これは、私がテストしたすべてのコーデックに当てはまりました。
その背後にある考え方は非常に単純です。フレーム間でピクセルが変化すると(動きの速いビデオなど)、システムはより多くの処理を行わなければなりません。つまり、より多くの帯域幅が必要になり、CPU はそれに追いつくためにより多くの処理を行わなければなりません。
たとえば、 AV1 を見てみましょう。1.5 メガピクセルの画面を共有するために AV1 を使用した場合、共有する内容によって必要な帯域幅が大きく変化しました。コンテンツがより動的だった場合、スムーズなストリームを維持するために AV1 は大幅に多くのデータをプッシュする必要がありました。次のグラフにこれを示しましたが、コンテンツの複雑さが帯域幅の使用にどれほど劇的な影響を与えるかを示しています。
しかし、帯域幅だけの問題ではありません。ハードウェアもそれを感じます。
次のグラフは、共有されるコンテンツに応じて CPU 使用率がどのように変化するかを示しています。ここでも AV1 を例にすると、より複雑なビジュアルでは、同じフレーム レートと解像度で動作し続けるために、より多くの CPU パワーが必要になることがはっきりとわかります。
これは AV1 に限ったことではありません。すべてのコーデックは、ビデオのエンコードとデコードに同じ基本原理を採用しているため、同様の動作を示すことが予想されますが、データは異なることを示しています。CPU 負荷はコンテンツによって変化するだけでなく、使用しているコーデックによっても変化します。
比較しやすくするために、次の表を作成しました。これは、1.5 メガピクセルのビデオを約 24 フレーム/秒でストリーミングする場合に各コーデックが使用する CPU の量を示しています。これは、スムーズな画面共有のための一般的な設定です。この結果から、ハードウェアの使用に関して各コーデックがどれだけ効率的であるかという大きな違いが明らかになります。
コーデック/CPU | AV1 | H264 | VP8 | VP9 |
---|---|---|---|---|
モーション | 287% | 213% | 270% | 364% |
文章 | 175% | 130% | 179% | 198% |
したがって、WebRTC 画面共有に依存する何かを構築または最適化している場合、重要なのは、コンテンツとコーデックの選択の両方が重要であるということです。非常に重要です。
画面共有に関して、最初に気づくことの 1 つは、ビデオがどれだけスムーズに感じられるか (または滑らかでないか) です。ここでフレーム レートが重要になります。ビデオ再生やアニメーションなど、動きの激しいコンテンツを共有する場合、途切れ途切れで見づらいストリームを避けるために、フレーム レートを高くすることが不可欠です。
実験のこの部分では、他のすべてを一定に保ちながら、さまざまcontentHint
コーデックでのフレーム レート パフォーマンスに焦点を当てました。つまり、各テストで同じ解像度 (約 1.5 メガピクセル) と同じコンテンツを使用しました。contentHint WebRTC 設定を使用して、解像度が全体的に固定されていることを確認しました。
次の画像では、帯域幅が増加するにつれて、さまざまなコーデックが動きの激しいコンテンツをどのように処理するかがわかります。 x 軸: Mbps 単位のビットレート。 y 軸: 1 秒あたりのフレーム レート (fps)。
注目すべき点は次のとおりです:
次に、動きの少ないコンテンツ(ゆっくりスクロールするテキスト ページ) に切り替えて、フレーム間であまり変化がない場合にコーデックがどのように機能するかを確認しました。
当然のことながら、このシナリオではH.264とAV1 の両方がさらに優れた結果を示し、 AV1 がトップに立っています。これは、AV1 が画面の変更されていない部分の再エンコードをスキップできるIntra Block Copyという機能のおかげです。これは、静的または半静的な画面共有に非常に効果的です。
次のグラフでは、AV1 がこれらの動きの少ない状況をいかに効率的に処理し、高画質を維持しながら帯域幅の使用量を大幅に抑えているかがわかります。
しかし…トレードオフがあります。
AV1 は、より優れたビジュアルと圧縮を提供しますが、 CPU の消費量も多くなります。次の画像では、これがはっきりと示されています。AV1 の CPU 使用率は、ビットレートが増加するにつれて着実に上昇し、H.264 をはるかに上回っています。H.264 は、広範囲にわたるハードウェア アクセラレーションにより、CPU 負荷が低く安定しているため、この点で大きな利点があります。
興味深いことに、 VP9 はAV1 よりもさらに多くのCPU を使用します。同様の傾向ですが、ピーク値は高くなります。VP9 と AV1 はどちらも、優れた品質を実現するために複雑なアルゴリズムに依存していますが、それにはコストがかかります。つまり、プロセッサに大きな負荷がかかります。
動きの少ないコンテンツを再検討したところ、意外な結果が生まれました。今回は、次のグラフに示すように、 VP8 と VP9 は実際にはかなり効率的で、AV1 よりも CPU の使用量が少ないことがわかりました。
AV1 は、画面共有を念頭に置いて設計されているにもかかわらず、依然として CPU を最も多く使用しています。なぜでしょうか? 動きの激しいビデオを圧縮するのに役立つすべての最適化によって、画面上であまり何も起こっていない場合でもオーバーヘッドが追加されます。
その大きな理由は、 AV1 にはまだ広範なハードウェア エンコード サポートがないことです。デコードは比較的軽量ですが、エンコードは依然として主にソフトウェアで行われ、特にエンコードとデコードの両方が絶えず行われる画面共有などのリアルタイム シナリオでは、CPU を集中的に使用するタスクになります。
ノートパソコンやタブレットなどのポータブル デバイスでは、この点が問題になります。ハードウェア アクセラレーションがないと、AV1 などのコーデックは電力を急速に消費し、リソースを大量に消費します。外出先で使用する場合には理想的ではありません。より優れたハードウェア サポートが普及するまで、AV1 の高度な機能には、かなり顕著なパフォーマンス コストが伴います。
これまで私が共有した結果は、解像度を一定に保ったテストから得たものです。帯域幅が逼迫すると、システムはフレーム レートを下げることで対応します。これは、静的コンテンツやテキストなどには理にかなっています。しかし、解像度を犠牲にしても、物事をスムーズに動かし続けることが目標の場合はどうでしょうか。
これを調査するために、フレーム レートを優先するように WebRTC を構成する新しい一連の実験を実行しました。これは、WebRTC のcontentHint
設定を使用して実行されました。これにより、高解像度とスムーズな動きのどちらがより重要であるかをブラウザーに伝えることができます。
私は、フレーム レートを30 fpsで一定に保つことを目指しました。これは、スムーズで快適な視聴に最適な値として広く認識されています。これを一定に保つのは困難でした。アダプティブ ストリーミングでは常に多少の変動があるからです。しかし、この結果から、各コーデックがこのトレードオフをどのように処理するかについて貴重な洞察が得られました。
この動作を分析するために、新しい指標を導入しました。
1秒あたりの送信ピクセル数 = フレームレート × 解像度
これにより、FPS や解像度だけを見るよりも完全な画像が得られます。さまざまな条件下でコーデックが 1 秒あたりに実際に配信している視覚データの量が表示されます。
モーションの激しいビデオでは、 AV1 が再びトップに立ちました。しかも、その差は歴然としています。低いビットレートでも、他のコーデックよりも 1 秒あたりに大幅に多くのピクセルを転送できました。これは、システムが高いフレーム レートを維持するプレッシャーにさらされているときに、AV1 が動的コンテンツをいかにうまく処理できるかを明確に示しています。次のグラフをご覧ください。
スクロールするテキストのあるウェブページのような動きの少ないコンテンツに切り替えると、競争は少し均衡しました。次の画像でわかるように、すべてのコーデックのパフォーマンスはより均一になりました。ただし、特に高ビットレートでは、 AV1 が依然としてリードを保っていました。圧縮の最適化により、リソース使用量を大幅に増やすことなく、強力なスループットを維持できました。
これらは実際には何を意味するのでしょうか?
そうですね、ビデオウォークスルー、ライブアニメーション、ゲームストリーミングなど、動的で動きの激しいビジュアルを使用するユースケースの場合、フレームレートを優先することで大きな違いが生まれ、AV1 はそのような環境で特に優れていることが証明されています。
動きの遅いコンテンツでも、AV1 は強さを発揮し続けています。差は小さいかもしれませんが、高度な圧縮戦略により、AV1 は一貫してより多くの映像データを送信でき、同じかそれ以下の帯域幅でより優れた品質を実現しています。
どちらの場合も、 「1 秒あたりの送信ピクセル数」の指標は、帯域幅が制限されているときにコーデックが解像度とフレーム レートのバランスをどのように取るかを理解するのに役立ちました。また、これらの条件下での AV1 のパフォーマンスは、システムが追加の CPU 要求を処理できる場合、最も有能なオプションであることをさらに確固たるものにしています。
フレーム レート、解像度、CPU 使用率の他に、画面共有パズルのもう 1 つの重要な要素があります。受信した画像が元の画像にどれだけ近いかということです。ここで、ピーク信号対雑音比 (PSNR) が重要になります。
PSNR は、圧縮されたビデオの品質を測定するために広く使用されている指標です。エンコード中にどの程度の歪み、つまり「ノイズ」が発生したかを示します。これはデシベル (dB)で測定され、経験則は単純で、高いほど良いということです。PSNR が高いということは、画像が元の画像とほぼ同じように見えることを意味し、スコアが低いということは、劣化が目に見えることを意味します。
これを理解するために、私は 2 つの異なるシナリオでコーデック間の PSNR 値をテストしました。1 つは解像度が優先される場合、もう 1 つはフレーム レートが優先される場合です。一貫性を保つために、両方のテストで同じ高モーション ビデオ コンテンツを使用しました。
この設定では、鮮明さが重視されます (ビデオが多少途切れても)。H.264は特に優れたパフォーマンスを発揮し、歪みを最小限に抑えて鮮明な映像を実現します。滑らかさがそれほど重要でない場合は、H.264 が強力な選択肢となります。
滑らかな動きを維持することに目標が移ると、特に高ビットレートではAV1 が優位になります。フレーム レートの目標を達成するために積極的に圧縮しながらも、画質を維持することができます。
コーデック間の PSNR の違いは必ずしも劇的ではありませんが、コーデックを選択する際のトレードオフが強調されます。鮮明さを優先するものもあれば、スムーズな動きを狙うものもあります。使用状況によっては、どちらかが他方よりも適している場合があります。
次に、スクロールされたテキスト コンテンツを使用して、同じテストを再度実行しました。これは、解像度と明瞭さの重要性を非常に強調するものです。
モーションを優先すると、すべてのコーデックの PSNR 値は非常に似たものになります。コンテンツはあまり変化しないため、圧縮戦略の違いは全体的な画像品質にそれほど影響しません。
ここからが面白いところです。解像度を優先すると、特に高ビットレートではAV1 が他のコーデックよりはるかに優れています。ここでのパフォーマンスは抜群です。
なぜでしょうか? AV1 には、テキストなどの静的で反復的なコンテンツを処理するための特別な最適化が含まれています。これにより、画像の忠実度を高く維持し、アーティファクトを回避し、より効率的に圧縮できます。そのため、ドキュメントの共有やコードのウォークスルーなど、鮮明で読みやすい詳細が本当に重要となるユースケースでは、AV1 は最適な選択肢となります。
つまり、PSNR は、画面共有品質の微妙だが重要な側面を強調するのに役立ちます。動きを優先するか鮮明さを優先するかにかかわらず、さまざまな制約の下でコーデックがどのように動作するかを理解することで、ジョブに適したコーデックを選択できます。
画面共有の品質におけるもう 1 つの重要な要素は、量子化パラメータ( QP)と呼ばれるものです。圧縮中にどの程度の詳細が失われるかを制御するものが何なのか疑問に思ったことがあるなら、それがこれです。
簡単に言えば、 QP はエンコーダーにビデオをどの程度圧縮するかを指示します。
PSNR は、画質がどの程度維持されたかという結果を示しますが、 QP はエンコーダーが何を目指していたかを示します。そのため、私は両方を調べました。
この研究では、
ここからが面白いところです。AV1は最高の PSNR スコアを持ち、つまり画像品質を最もよく維持していましたが、 QP 値も他のコーデックより最大 4 倍も高かったです。一見すると矛盾しているように思えます。
しかし、ここに落とし穴があります。各コーデックは QP を異なる方法で定義および処理するため、値を直接比較することはできません。あるコーデックの QP が 50 だからといって、別のコーデックの QP が 50 だからといって、必ずしも同じレベルの圧縮を意味するわけではありません。
それでも、QP の傾向は役に立つ情報を与えてくれます。すべてのコーデックで、帯域幅が増加すると QP が減少することがわかりました。これは理にかなっています。利用可能な帯域幅が増えると、コーデックは圧縮を減らして画像品質を向上させることができます。
したがって、QP 番号をコーデック間で並べて表示することはできませんが、利用可能なネットワークの状態に基づいて各コーデックが圧縮を動的に調整する方法は示されます。
結論: QP は品質スコアではなく設定です。ただし、帯域幅に応じて QP がどのように変化するかを追跡すると、エンコーダが舞台裏で何を実行しているかを把握するのに役立ちます。また、PSNR と組み合わせると、コーデックの動作をより完全に把握できます。
WebRTC が内部でどのように機能するかを詳しく調べてみると、1 つ明らかなことが分かります。それは、すべてのコーデックが同じように作成されているわけではなく、最適な選択は優先順位と環境によって決まるということです。
私の実験から得られた重要なポイントは次のとおりです。
AV1 は、動きの速いビデオを共有する場合でも、ゆっくりスクロールするテキストを共有する場合でも、一貫して最高の画質を提供しました。高度な圧縮と最適化により、非常に効率的ですが、それには代償が伴います。AV1 はCPU を大量に消費し、ハードウェアのサポートがまだ追いついていないため、低電力デバイスやモバイルデバイスにはまだ適していません。
パフォーマンスと効率のバランスを求める場合、H.264 は依然として優れた選択肢です。H.264 は広くサポートされており、ほとんどのプラットフォームでハードウェア アクセラレーションが行われ、ほぼすべてのシナリオで優れたパフォーマンスを発揮します。特に、システム リソースやバッテリー寿命が懸念される場合に有効です。
共有するコンテンツの種類は、パフォーマンスに大きな影響を与えます。動きの激しいビデオは、ドキュメントやテキストなどの静的コンテンツよりも CPU と帯域幅に多くの負荷をかけます。コンテンツに適切なコーデックと適切な設定を選択すると、品質とリソース使用量に大きな違いが生じます。
私が作成したカスタム Chrome プラグインのおかげで、画面共有中の CPU 使用率を正確に測定できました。結果では、各コーデックの要求度に大きな違いが見られました。これは、モバイル デバイスやエネルギーに敏感な環境では特に重要になります。
この実験は、いくつかのエキサイティングな次のステップへの扉を開きました。今後の取り組みがさらに大きな影響を与える可能性があると思うのは次の点です。
これまでのところ、すべてのテストはデスクトップで行われていますが、画面共有は携帯電話やタブレットでも同様に(あるいはそれ以上に)一般的です。これらのコーデックがモバイルでどのように機能するかをテストすると、特に応答性と電力使用量の点で、より完全な画像が得られます。
電力について言えば、コーデックは CPU を消費するだけでなく、バッテリー寿命も消費します。今後の研究では、特にポータブル デバイスでの長時間の画面共有セッションの場合、どのコーデックが最もエネルギー効率が良いかを探る必要があります。
WebRTC が現在のコンテンツとネットワーク速度に基づいてコーデック設定を自動的に調整できるとしたらどうでしょう。AIはそれを可能にし、品質とパフォーマンスの最適なバランスをリアルタイムで動的に見つけ出します。
コーデックの選択は単なる技術的な決定ではありません。画面共有エクスペリエンスの品質、スムーズさ、リソースの使用に直接影響します。ビデオ会議ツールやコラボレーション プラットフォームを構築する場合でも、独自のワークフローを最適化する場合でも、さまざまな条件下でこれらのコーデックがどのように動作するかを理解することで、よりスマートで効果的な決定を下すことができます。
WebRTC が進化し続けるにつれて、それに関連するツールやテクニックも進化していきます。この詳細な説明が、舞台裏で何が起こっているのか、そして画面共有スタックを最大限に活用する方法を他の人に理解してもらうのに役立つことを願っています。
結果をさらに詳しく調べたり、独自の分析を実行したりしたい場合は、この研究の完全なデータセットをここで公開しています。
フレーム レート、解像度、PSNR、QP、CPU 使用率などの生のメトリックが含まれており、すべてコーデック、コンテンツ タイプ、帯域幅の状態別に整理されています。独自の実験やベンチマークに自由に使用したり、さまざまなシナリオで WebRTC がどのように動作するかを調べたりできます。