世界を動かす技術を、日本語で。

自分専用の高速ゲームストリーミング動画コーデックを設計しました – PyroWave

概要

本記事では、超低遅延なローカルゲームストリーミング向けに設計した独自ビデオコーデックのアーキテクチャと最適化手法を解説。 既存のH.264/HEVC/AV1などの汎用コーデックで不可避な遅延要素を排除し、圧倒的な高速動作とエラー耐性を両立。 DWT(離散ウェーブレット変換)ベースの圧縮、エントロピー符号化の排除、ハードウェアフレンドリーな設計思想。 実装例やパフォーマンス評価、品質比較も交え、ローカルLAN環境での実用性を検証。 独自コーデック設計の難所や工夫も詳しく紹介。

超低遅延ゲームストリーミングの要件

  • ゲームプレイ映像 をネットワーク越しに リアルタイム転送 する用途の増加
  • 1ミリ秒単位の低遅延 が必須条件
  • 一連の処理フロー:
    • A→B:コントローラ入力送信
    • B:GPUでフレーム描画・ビットストリーム化
    • B→A:映像データ送信
    • A:デコード・画面表示
    • ユーザー脳内で快感物質分泌
  • 各処理の 遅延削減 が最重要課題
  • 20ms以内 で全工程を完了する理想

既存コーデックの課題と制約

  • H.264/HEVC/AV1 等は 高圧縮率 だが 遅延発生 が避けられない
  • バッファリングやBフレーム などの圧縮テクニックを 封印
  • CBR(固定ビットレート)運用 が必須
    • 可変ビットレートバッファ は使えない
  • パケットロス耐性 も考慮
  • LAN内ストリーミング では 帯域制約が緩い
    • ギガビットイーサネット高速WiFi が前提
  • 帯域重視から遅延重視 への発想転換

独自コーデック設計のアプローチ

  • モーション予測排除(イントラオンリー)
    • ビットレート増加 だが エラー耐性・シンプル設計・品質安定
    • Motion JPEG2000 等と同系統
    • 100Mbps超 の帯域消費
  • エントロピー符号化排除
    • GPU並列化 に不向きな処理をカット
    • VESA DSC 等の事例も参考
    • 汎用ソフトウェア実装が少ない領域
  • DWT(離散ウェーブレット変換)圧縮
    • DCT系コーデック の代替案
    • 画像を多段階でダウンサンプリング・誤差成分抽出
    • 5段階分解 を採用
    • 高周波成分は強く量子化 し、視覚特性を活用
    • 典型的なアーティファクトはブラーやリンギング

パケットロス耐性・GPUフレンドリーなビットストリーム設計

  • 32×32係数ブロック 単位で独立デコード可能
    • パケットロス時は全ゼロ補完で局所的なブラー
  • 8×8→4×2ブロック へ階層化
    • GPUスレッド階層に最適化
      • 1スレッド:4×2係数
      • サブグループ:8×8ブロック
      • ワークグループ:32×32ブロック(128スレッド)
    • 8ビットストレージ 活用、ビット操作を極力排除
  • ビットプレーン符号化 を採用し、 エントロピー符号化は非採用
    • 4×2ブロック単位でビット数管理
    • 符号ビットは32×32ブロック末尾に集約

高速・正確なレートコントロール

  • CBR厳守のための独自レート制御
    • 各ブロックで1,2,3…ビット削除時の誤差とビットコストを事前計算
    • 画質劣化/ビット節約効率順に並べ、必要数だけ削減
    • 全体で目標ビット数に収束
    • ビットプレーン単位でコントロール可能なため、CBR運用が容易

実装・パフォーマンス評価

  • Expedition 33(1080p 4:2:0)でのエンコード/デコード
    • RX 9070 XT(RADV)でエンコード0.13ms、デコード100μs未満
    • DWTパス・量子化パスをFP16最適化
  • 4K 4:2:0(ParkJoyシーン)
    • 0.25msでエンコード
    • PCI-e転送より圧縮→転送の方が高速
  • 専用ハードウェアコーデックより1桁高速
    • 遅延削減に直結
    • Steam Deckでのデコード時消費電力も微小

品質比較・主観評価

  • H.264/HEVC/AV1(NVENC/VAAPI)との比較
    • 200Mbps超・60fps運用目視上は大差なし
    • 品質評価にはpsy-ex/metricsを活用
  • シンプルな構造ながら十分な画質を実現
    • CBR未達のVAAPIは除外
    • サイドバイサイド比較や拡大で差異確認可能

まとめ・今後の展望

  • イントラオンリー・非エントロピー符号化・DWT圧縮超低遅延ストリーミング を実現
  • GPUネイティブな並列処理設計圧倒的なエンコード/デコード速度
  • LAN内や帯域制約の緩い環境で特に有効
  • 今後の課題は画質向上・帯域最適化・汎用化
  • 既存コーデックの常識を覆すアプローチの可能性

Hackerたちの意見

信じられない…いい仕事だね。いつかこれがMoonlightとかに入るのが待ちきれないよ。

まさに俺が考えてたことだ。自分でこのコーデックのサポートを追加する時間と専門知識があればいいのに。Sunshine / Moonlight経由でLAN上でClair Obscureをストリーミングするのが俺の使い方で、レイテンシーはもっと良くできるはずだ。

動画エンコーディングについてはほとんど知らないけど、ゲームストリーミングにはもっと簡単にできることがたくさんある気がする。エンコーダーがゲームエンジンとちょっとでも協力すれば、例えばモーション予測なんかは無料でできるはずだよ。ほとんどのレンダリングエンジンはそのための専用バッファを持ってるからね。でも、たぶん厄介な特許があってイノベーションを妨げてるんだろうな。だから、忘れちゃった方がいいかも!

2Dスプライトゲームなら、OMG、エンコーダーにかなり正確なモーションベクトルを提供できるよね。3Dレンダリングゲームについては、ちょっと自信がないな。レンダリングエンジンは3Dオブジェクトのモーションベクトルを持ってる(または持てる)けど、それをエンコーダーが使う2Dの世界に変換しなきゃいけない。これが合理的かどうかは分からないし…エンコーダーにとってどれだけ役立つかも疑問だな。

ゲームには通常、モーションベクトルバッファはないと思う。比較的簡単にレンダリングできるかもしれないけど、それってちょっと鶏と卵の問題だよね。

動き予測みたいなものは、ほとんどのレンダリングエンジンがそのための専用バッファを持ってるから、タダでできるよ。透過性やシェーダーアニメーションにはうまくいかないけど、後者はシェーダーが動きベクトルも計算できればうまくいくかもね。

H.264の「動きベクトル」は、奇妙なビット操作や画像圧縮のハックで、実際の動きベクトルとは関係ないんだ。 3Dゲームでは、動きベクトルはオブジェクトの3D空間における位置の前のフレームと現在のフレームの違いを指す。H.264では、「動きベクトル」は基本的に、ある任意の前のフレームからこの矩形のピクセルの塊をコピーして、その参照ピクセルとコピーの違いをJPEGのような技術(DCTなど)でエンコードするってこと。このブロックコピーが原因で、H.264の動画は帯域幅が落ちると四角いゴチャゴチャになっちゃうんだ。

最終的な圧縮は、ユーザーの入力だけを送って、向こうでゲームの状態を再構成することだね。

これについても考えたことあるよ。ほとんどのクライアントは、まだ少しは合成ができるはずだし。例えば、背景のオブジェクトを前景のキャラクターよりも低い解像度や頻度でビルボードレンダリングして送ったり、優先度をつけてHUDオブジェクトを更新したり、明瞭さを優先するCODECを使ったりとか。スタディアが自社でゲームを作ってたのに、結局はただのストリーミングビデオになってしまったのはいつも衝撃だった。レイテンシの改善はエッジに展開されたGPUとWi-Fi接続のコントローラーから来るはずだったのに。まあ、もしかしたら彼らはこういうことを試してみたけど、戦闘テスト済みのビデオCODECに対して得られる利益が少なかったのかもね。

君の言う通りだと思う。ゲームストリーミングサービスへの接続が2フレームのレイテンシを追加する場合、プレイヤーがFPSをプレイしていると仮定しよう。ゲームエンジンができることの一つは、ゲームのUIと「3Dワールドビュー」を別々のフレームバッファとして提供することだね。そうすれば、クライアントでマウスを動かすと、ソフトウェアはサーバーから来た次の2フレームの3Dワールドビューを瞬時に変換できる。VRゲームはすでにこういうことをやっていて、ゲームがVRヘッドセットの最大FPSを下回っても、頭の動きには反応できるんだ。完璧ではないけど、視差がないし、以前は視界に入ってなかった領域を表示できないけど、それでも大きな違いがあるよ。(もちろん、VRではこれが重要で、これをしないとゲーム内のレイテンシスパイクがプレイヤーに即座に乗り物酔いを引き起こすからね。もしやりたければ、深度マップを使って視差を偽装することもできるし。)

最初に始めるのにシンプルなアイデアとしては、センサーアシストビデオエンコーディングみたいなものがあるね。スマホの加速度センサーやデジタルコンパスを使って、ビデオエンコーディングにヒントを与える感じ。あと、2Dゲームでは、シンプルな横スクロールゲームが背景や大きな前景の直線的に動くオブジェクトの動きベクトルを非常に正確に提供できると思う。君のアイデアに反対してる人がこんなにいるのは驚きだよ。HNには「どうやってできるかわからないなら、できない」って考える人が多い気がする。追記:HUDや地図、スコア、字幕、メニューなどの2Dグラフィックオーバーレイも、2D圧縮データとして送信できるから、そのデータの圧縮がより良くなるかも。例えば、シンプルな形状のために、もっとシャープなピクセルパーフェクトエンコーディングが可能になるかもしれないね。

このコーデックがどれだけニッチで難解かを考えると、実際に比較できる競合コーデックを見つけるのは難しいね。H.264/AVC(下の「ゼロレイテンシー」ffmpeg設定を参照)やJPEG XSとのベンチマークが見てみたいな。 -c:v libx264 -preset ultrafast -tune zerolatency \ -x264-params "keyint=1:min-keyint=1:scenecut=0:rc-lookahead=0" \ -bf 0 -b:v 8M -maxrate 8M -bufsize 1M

すごい!研究プロジェクトにほぼぴったりだよ。ちなみに、非無料のJPEG-XS規格もあって、これも非常に低レイテンシーを謳ってるし、特許プールがあるから商業プロジェクトには安全な選択かもしれないね。[1] https://www.jpegxs.com/ [2] https://ds.jpeg.org/whitepapers/jpeg-xs-whitepaper.pdf

JPEG-XSは低遅延にはいいけど、帯域幅は多めに使うんだ。映画やテレビのポストプロダクションで、低遅延の画像ストリーミングに使ってるよ。 https://www.filmlight.ltd.uk/store/press_releases/filmlight-... 今はIntoPIXのCUDAエンコーダー/デコーダーを使ってて、低レベルのトランスポートにはSRTを使ってる。 decentなネットワークなら、エンドツーエンドの遅延は16ms未満にできるよ。データセンターにマシンを設置して、街の中心にあるポストプロダクション施設で使ってるお客さんもいるし、たいていは10GbEリンクを使ってる。でも、国をまたいで1GbEリンクを使って、高圧縮率で運用してる人もいるよ。

特許プールは安全にはならないよ。ただの特許トロールが橋を渡るためにお金を取ってるだけさ。橋を渡った後に、さらに別の特許トロールからの恐喝に対する保険なんて提供してないしね。

NDIの便利さがない感じだね。nvencが遅いなら、何か間違ってるよ。llhpプリセットだけで十分なはず。

VLCのクリエイターが似たようなものを開発してるらしいよ。めっちゃ最先端だって。超低遅延のストリーミングについてのインタビューがあるよ。 https://streaminglearningcenter.com/codecs/an-interview-with... https://www.youtube.com/watch?v=0RvosCplkCc

この分野で働いてきたけど、ハードウェアエンコーダーとH.264はかなり優秀だよ。NVENCは遅延がほとんどないし(そう設定すれば、フレーム予測やBフレームみたいな遅延を増やす機能を無効にすればね)。遅延を増やす要因は、より高度な処理アルゴリズムや、複数フレームを待つ必要があるスキームだよ。それを無効にすれば、エンコーダーはGPUがレンダリングをやめた瞬間からフレームの処理を始められるし、10ms未満でエンコードできるよ。

残念ながら、利用できないみたい。

ゲーム内で起こっていることをLLMにフレームごとに数文に書き起こさせて、そのテキストをネットワーク越しに転送して、別のLLMにそのテキストからフレームを再構築させるってのはどう?速くはないし、ロスが出るけど、圧縮率はすごいし、流行りのキーワードも揃ってるよ。

それ、興味あるわ。

いつかは、ゲームがエンドユーザーのマシンでローカルに動く時代が来るかもね。

フレーム1:君は白い家の西にある開けた野原に立っていて、前のドアには板が打ち付けられてる。ここには小さな郵便受けがあるよ。

説明をブロックチェーン経由で送信して、不変の記録を残そう。

このCODECはHTJ2K(ハイスループットJPEG 2000)と同じ基本アルゴリズムを使ってるんだって。もし作者がこれを読んでたら、この方法とHTJ2Kの違いについて聞いてみたいな。

これは、既知の信号タイプに対する許容できる歪みとトレードオフをマッチさせるための、すごく良いウォークスルーだね。コーデックを選ぶだけでも、設計するわけじゃなくても、フォローする価値があるプロセスだと思うよ。超低遅延の分野に興味がある人には(品質を上げて遅延を最小限に抑えるために、少しの帯域幅を犠牲にする覚悟があるなら)、VSFが他の一般的なオプションとそれぞれの最適化についてのまとめを出してるから、参考になるよ。

もしローカルネットワークストリーミングだけに集中してるなら、現代のコーデックのほとんどの機能を捨ててもいいよ。トレードオフは帯域幅だけど、ネットワークが100 Mbpsをサポートできるなら、比較的少ない処理で驚くほど低遅延を実現できる。例えば、マイクロソフトのDXTコーデックは、ほとんどの現代的な機能(エントロピーコーディング、モーションコンプ、デブロッキングなど)が欠けてるけど、約4倍から8倍の圧縮を提供して、ハードウェアデコードも可能(デコードと表示の遅延を節約できる)。もちろん、エンドツーエンドのキャプチャ・エンコード・トランスミット・デコード・ディスプレイのループを10ms未満に調整したら、今度はディスプレイによって導入される30-100msのビデオ処理遅延に対処しなきゃいけないけどね。😊