VR動画配信と低遅延化技術

カバー

[!] この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

本ブログでは動画配信技術について、過去記事「HLSによる社内向け動画配信」で取り上げさせていただいたことがありますが、 動画配信は近年話題のVRでも活用されています。VR動画配信では、通常の動画配信よりも「低遅延」で「高解像度」な配信技術が重要となる様々なユースケースがあります。 今回は、VR動画を配信するのは通常の動画配信と何が異なるのか、「低遅延」で「高解像度」な配信には何が必要か、検証環境の構築を交えつつ解説していきます。

VR動画配信について

現実空間の映像をVRで視聴可能な全天球映像として配信するには、「360度カメラ」 と呼ばれる上下左右の全方位を一度に撮影できる専用カメラを使用します。 今回は配信を目的とするので、ライブストリーミング対応の機種を選択します。

  • VR動画のライブストリーミングに対応した360度カメラの代表例
    • RICOH THETA Z1 51GB
    • Insta360 ONE X2
    • QooCam 8K

これらで撮影した動画は、以下のような「正距円筒図法(Equirectangular)」と呼ばれる特殊な形式で出力されます。 撮影の際は人の目線と同じ高さになるよう自撮り棒や三脚を扱う必要があり、少し独特な撮影のコツが必要です。

.

撮影した動画をVRゴーグルで快適に視聴するには、VR対応動画プレイヤーを使用します。代表的なVRゴーグル「Meta Quest 2(旧Oculus Quest 2)」を例に挙げると、 Quest内蔵のブラウザや「YouTube VR」など複数のアプリが対応しており、YouTubeなどのVR対応動画プラットフォームに配信すれば視聴するだけなら簡単に行うことができます。 しかしながら、VR動画の視聴は現実空間と遜色ない速度で映像を描画する必要があるため、目安として4K(3840x2160)以上の解像度と、30fps(1秒間に30枚のフレーム)以上のフレームレートが推奨されますが、 殆どの動画プラットフォームではこの条件でライブ配信を行うと数十秒の遅延が発生します。ここにVR動画配信を音声会議と併用する上での難しさがあります。

動画配信の低遅延化技術について

ところで、何故このような遅延が発生するのでしょうか。通常の動画配信では、インターネット回線の上りはOBS Studioなどの配信ソフトウェアからのRTMPによる送信、下りはHLSやMPEG-DASH(以下、DASH)といったストリーミング方式で配信されるのが一般的であり、 遅延の主な原因は後者のストリーミング方式にあります。HLSやDASHは大量配信には適していますが、既に過渡期の技術であり、また、遅延よりもストリームの信頼性などを重視して設計されています。 しかし、インターネットの高速化とWeb会議やリモート授業などの低遅延ユースケースの増加により、遅延の問題を解決する幾つかの方式が登場してきました。ここでは以下の2つを紹介します。

Apple Low Latency HLS (LL-HLS)

独自規格のHLSを推進してきたApple社が開発したHLSベースの低遅延ストリーミング方式が「Apple Low Latency HLS (LL-HLS)」です。 通常のHLSは過去記事でも解説の通り、動画などを指定時間ごとに分割した「メディアセグメント」とその再生情報を記載した「再生リスト」の2種類のファイルをWebサーバーで公開しますが、 セグメントのファイル出力完了を待たずにさらに小さい「チャンク」と呼ばれる単位で配信し、再生リストの情報を低遅延に対応することで、 WWDC2019の公式発表によると2秒未満の低遅延配信を実現しています。主にApple社製品やWowza Streaming Engineなどの商用製品が対応しています。

Low Latency MPEG-DASH (LL-DASH)

動画の標準化団体MPEGが開発したDASHは国際標準規格のストリーミング方式ですが、 DASHの業界フォーラムであるDASH-IFなどによって開発された低遅延方式が「Low Latency MPEG-DASH (LL-DASH)」です。 DASHもHLSと似たファイル構成であり、再生リストは「マニフェスト」と呼ばれます。LL-HLSと同様にセグメントのファイル出力を待たずにチャンク単位の配信で低遅延を実現します。 こちらも5秒未満の低遅延配信を実現していますが、LL-HLSと異なる点として、オープンな規格でコミュニティ主導の開発が活発であり、オープンソースソフトウェア(OSS)を活用して比較的簡単に本記事で紹介する検証環境を構築することができます。

検証環境

本記事では、開発者が検証環境構築を通してVR動画配信の仕組みを理解することを目的として、OSSによるLL-DASHの実証実験記事(資料1,2)を参考に、少しアレンジして360度カメラ映像とVRゴーグルを組み合わせたVR動画配信に対応した環境を構築してみます。 なお、この検証環境は実証実験ベースのため高解像度における配信性能や安定性はさほど高くありません。実用レベルのVR動画配信を実現したい方は、有償ストリーミングサーバを利用することを推奨します。

システム構成図

ハードウェア

ここでは検証環境の都合により、検証に使用した機種の設定を例に記載させていただきます。

  • 無線LANルーター
    • IPアドレスは192.168.0.1/24とします。
    • DHCPサーバ機能を有効にします。
  • 配信用PC 1台
    • Windows 10以上のOSでハードウェアエンコード機能を搭載した機種を準備します。
    • IPアドレスはDHCPで 192.168.0.0/24 の空いているアドレスを割り当てます。
  • ストリーミングサーバ 1台
    • Windows 10以上のOSでハードウェアエンコード機能を搭載した機種を準備します。
    • IPアドレスは192.168.0.2/24とします。
  • VRゴーグル
    • 本記事ではMeta Quest 2を使用します。
    • IPアドレスはDHCPで 192.168.0.0/24 の空いているアドレスを割り当てます。
  • 360度カメラ
    • 本記事ではRICOH THETA Z1 51GBを使用します。配信用PCにライブ配信用ドライバをインストール後、USB接続します。

ソフトウェア

インストーラはすべてWindows版を使用します。

  • OBS Studio
    • こちらから最新版をダウンロードし、配信用PCにインストールします。
  • node.js
    • こちらから最新版をダウンロードし、ストリーミングサーバにインストールします。
  • ffmpeg
    • こちらの[Windowsアイコン]-[Windows EXE Files]から有志のバイナリ配布サイトを経由して最新版のビルド済みバイナリをダウンロードし、ストリーミングサーバの C:\ffmpeg に解凍して展開します。
    • ビルド済みバイナリは「full」の名称を含むファイル(全ての機能がビルド済みのバイナリ)を選択します。 有志サイトによっては、zipファイル以外の拡張子で配布されている場合があるため、対応した解凍ソフトを使用してください。
    • 環境変数PATHに C:\ffmpeg\bin を追加します。
  • Git for Windows
    • こちらから最新版をダウンロードし、ストリーミングサーバにインストールします。

環境構築手順

  1. 配信用PCの準備
    • OBS Studioを起動し、以下の設定を実施します。
      • メディアソース
        • [映像キャプチャデバイス]を追加し、360度カメラを割り当てます。
      • [設定]-[配信]
        • サーバー: rtmp://192.168.0.2:1935/live/
        • ストリームキー:app
      • [設定]-[出力]
        • エンコーダ:ハードウェアエンコードに対応したGPUのエンコーダを選択します。
      • [設定]-[映像]
        • 基本(キャンパス)解像度:360度カメラの出力解像度に合わせます。
        • 出力(スケーリング)解像度:360度カメラの出力解像度に合わせます。
  2. ストリーミングサーバの準備
    • コマンドプロンプトを開き、以下のコマンドを実行します。
      mkdir C:\gitwork
      cd C:\gitwork
      git clone https://github.com/kokutele/ll-dash-server.git
      npm install
    • 以下のソースコードを C:\gitwork\ll-dash-server\ll-rtmpsrc.bat という名称で保存します。(GPUの種類に応じたハードウェアエンコード用のオプション設定の最適化については、本記事では割愛します)
      ffmpeg -f flv -listen 1 ^
        -i rtmp://0.0.0.0:1935/live/app ^
        -c:a aac ^
        -c:v h264 -force_key_frames "expr:gte(t,n_forced*4)" -profile:v baseline ^
        -map v:0 -b:0 1000k -s:0 640x360 ^
        -map v:0 -b:0 500k -s:1 320x180 ^
        -map a:0 ^
        -ldash 1 -streaming 1 ^
        -use_template 1 -use_timeline 0 ^
        -adaptation_sets "id=0,streams=v id=1,streams=a" ^
        -seg_duration 4 -frag_duration 1 -frag_type duration ^
        -utc_timing_url "https://time.akamai.com/?iso" -window_size 15 ^
        -extra_window_size 15 -remove_at_exit 1 ^
        -f dash ${PWD}/../dash-data/1.mpd
    • メモ帳で C:\gitwork\ll-dash-server\public\index.html を開いて<video>タグの行を探し、id属性の後に以下のように「controls」の文字列を追加します。
      <video id="video-player" controls></video>

配信実施

準備ができたら、配信を開始して実際にVRゴーグルで視聴してみましょう。

  1. ストリーミングサーバの起動
    • ストリーミングサーバで2つのコマンドプロンプトを開きます。
    • 1つ目のコマンドプロンプトで以下のコマンドを実行します。
      cd C:\gitwork\lldash-server
      ll-rtmpsrc.bat
    • 2つ目のコマンドプロンプトで以下のコマンドを実行します。
      cd C:\gitwork\lldash-server
      node index.js
  2. 配信開始
    • 360度カメラを起動し、配信用PCのOBS Studioに映像が表示されたら[配信開始]をクリックします。
    • 配信が開始されたら、遅延を測定するためにカメラに時計などを映しておきます。
  3. 視聴開始
    • Meta Quest 2を起動し、ブラウザで http://192.168.0.2:5000 にアクセスします。

    • [Start]ボタンを押すと視聴を開始できます。 最初はブラウザウィンドウに平面として表示されるため、VR表示に切り替えるには、右下の拡大アイコンで全画面表示にした後、画面下部の[非VR]を[VR360度]に変更します。

正常に表示できているでしょうか。VRゴーグルの映像と手元の時計の時間を比べることで、配信の遅延時間を測定することができます。

PCの性能が足りていれば10秒未満の低遅延で映像を視聴することができるかと思います。なお、本記事のffmpegオプションでは解像度がかなり低く設定されています。 PCのスペックによっては高解像度に変更しても動作する可能性はありますが、高解像度で配信を安定化させるには設定パラメータの高度な知識と試行錯誤が必要となるため、今回は割愛します。

まとめ

今回は、VR動画配信の基礎と動画配信の低遅延化技術を紹介し、OSSによるLL-DASHの実証実験環境をVR動画配信向けに改良するところまで紹介しました。 VR動画配信に興味のある方は、是非一度試してみてください。

謝辞

本記事の執筆にあたり、以下のサイトを参考にさせていただきました。

Footnotes

  1. Low-latency dash streaming using open-source tools

  2. ffmpeg で low latency DASH server 作ってみた


TOP
アルファロゴ 株式会社アルファシステムズは、ITサービス事業を展開しています。このブログでは、技術的な取り組みを紹介しています。X(旧Twitter)で更新通知をしています。