Android
WebRTC
Theta
THETAPlugin

THETA V 単体で 360° 映像をリアルタイム配信する

【10月20日 開催】RICOH THETAプラグイン開発ワークショップ#1
プラグイン開発を実装まで体験できる実践的なワークショップです。まだ若干の空きがありますので、ご興味のある方はぜひご参加ください。
→ ご参加いただいた皆様、誠にありがとうございました!

はじめに

こんにちは、リコーの @shrhdk_ です。

RICOH THETA V は、Android ベースの OS で動いており、Android アプリとして THETA プラグイン を開発することで、THETA V の機能を拡張できます。

THETA V はほぼフルスペックの Android スマホで、高速な Wi-Fi も搭載しています。実は、映像のリアルタイム配信なんかも THETA V 単体で実現できます。

今回は RICOH Live Streaming API を利用して、THETA V から 360° 映像をリアルタイム配信するプラグインを作ったのでご紹介します。

システム構成

RICOH Live Streaming API は WebRTC を利用して、映像音声をリアルタイム配信可能なクラウド API です。WebRTC ですので、送信側も受信側も一般的な Web ブラウザと少々の JavaScript で簡単に映像配信を実現できます。

THETA プラグイン側はネイティブアプリから WebRTC を利用できる libwebrtc を利用します。今回は 公式のビルド済みバイナリ を利用します。

受信側は、 Live Streaming API SDK のサンプル をそのまま利用します。

概要

前準備

API 利用登録とクライアント作成

RICOH Live Streaming API を利用するには、THETA V プラグインの開発者登録とは別に、API の開発者登録が必要です。

Get Started - RICOH Developer Connection の説明に従って、クライアントを作成して、Client ID と Client Secret を入手してください。

今回は Live Streaming API を使いますので、クライアントのプロダクトに「 Live Streaming API」を追加してください。

クライアント管理画面

アクセストークンの入手とルームの作成

Client ID が入手できたら、curl コマンドでアクセストークンを要求してみましょう。$CLIENT_ID$CLIENT_SECRET は実際のものに置き換えてください。

curl --request POST "https://auth.api.ricoh/v1/token" \
     --user "$CLIENT_ID:$CLIENT_SECRET" \
     --header "Content-Type: application/x-www-form-urlencoded" \
     --data "grant_type=client_credentials" \
     --data "scope=sfu.api.ricoh/v1/sfu"

成功するとアクセストークンを含んだ JSON が返ります。

{"access_token":"himitsu..."}

映像配信するには仮想的なルームをあらかじめ作る必要があります。入手したアクセストークンを使ってルーム作成要求を送ってみましょう。$ACCESS_TOKEN は実際のアクセストークンに置き換えてください。

curl --request POST "https://sfu.api.ricoh/v1/rooms" \
     --header "Authorization: Bearer $ACCESS_TOKEN"

成功すると Room ID を含んだ JSON が返ります。

{
  "id":"b008bd6f-7d89-43c4-b047-a0e0fc1c1bf3",
  "created_at":"2018-08-30T07:53:55Z",
  "up_count":0,
  "down_count":0
}

THETA をインターネットに接続する

RICOH Live Streaming API はクラウド API ですので、インターネット接続が必要となります。 THETAで愛を伝える【THETAプラグイン開発】 を参考に、THETA V をインターネットに接続してください。

これで Live Streaming API を利用する準備ができました。

プラグイン (映像送信側)

こちらのリポジトリで配信プラグインのプロジェクト一式を公開しています。実装の詳細やプロジェクトのビルド方法はリポジトリをご参照ください。

ここでは、大まかな処理の流れと THETA プラグイン特有の注意点をご紹介します。

処理の流れ

プラグインは Live Streaming API に接続して、映像配信に必要な情報を取得します。取得した情報を libwebrtc に設定して映像の送信を始めます。

シーケンス図

THETA 特有の注意点

実行時パーミッションチェックへの対応は不要

今回のプラグインはカメラ機能を利用するため、通常の Android であれば 実行時パーミッションへの対応が必要となります。

しかし、THETA プラグインはインストール時に権限を設定する仕組みになっているため、実行時パーミッションへの対応は不要です。

開発時はアプリ設定から事前に権限を設定します。権限の設定方法は以下の記事で解説されています。

THETAプラグイン開発におけるVysorの使い方【THETAプラグイン開発】 - Qiita

カメラモードの設定が必要

THETA プラグインではカメラ利用時に Shooting Mode を適切に設定する必要があります。今回は動画を取得するため、 RicMoviePreview1920 に設定します。

また、独自パラメータの設定が必要なため、libwebrtc に同梱された org.webrtc.CameraVideoCapturer はそのまま利用できません。 今回は 独自の VideoCapturer を実装し、その中でパラメータを設定しています。

ThetaCapturer の実装は https://github.com/lyokato/theta-plugin-sora-experimental を参考にさせていただきました。

カメラ利用の宣言が必要

THETA ではシステムアプリが常にカメラを利用しているため、プラグインからカメラを利用する前に、ブロードキャストインテントを送信してカメラを開放してもらう必要があります。

参考: Notifying Camera Device Control

sendBroadcast(new Intent("com.theta360.plugin.ACTION_MAIN_CAMERA_CLOSE")); // カメラを使う前に送る

映像受信側

映像の受信側は Live Streaming API SDK のサンプル を利用します。

サンプルのリポジトリをダウンロードしたら以下のコマンドでサーバーを起動します。実行には Node.jsyarn が必要です。

$ cd ricoh-cloud-sdk-js/samples/sfu-server       # sfu-server のディレクトリに移動
$ yarn                                           # 依存パッケージのインストール
$ export RDC_CLIENT_ID=<your client id>
$ export RDC_CLIENT_SECRET=<your client secret>
$ yarn start                                     # 起動

起動に成功したら Web ブラウザで http://localhost:3000/watch.html にアクセスします。以下の画面が表示されれば成功です。

受信側画面

動作確認

プラグインは起動すると、すぐにハードコードされた Room ID のルームに接続し、映像の送信をはじめます。

(※ Vysor で取得した THETA の画面です。部屋が汚いのでモザイクをかけています……。)

プラグイン画面

プラグインの起動を確認したら、受信側を開きます。 http://localhost:3000/watch.html

受信側初期画面

List ボタンを押すと Client ID に紐付けられたルームの一覧が表示されます。ボタンが青くなっているルームで映像が配信されています。

受信側ルーム一覧

ルームのボタンを押すと、映像の受信がはじまります。Equirectangular 方式の360°映像を受信できています。

(※ 部屋が汚いのでモザイクをかけています……。)

受信側&nbsp;映像受信画面

まとめ

THETA プラグインと RICOH Live Streaming API と組み合わせることで、THETA 単体で簡単に 360° 映像を配信できました。

THETAプラグイン開発に興味を持たれた方はぜひパートナープログラムにご登録ください!
なお、登録時に申請したシリアルナンバーのTHETAについてはメーカーサポート対象外になりますので、ご注意ください。

また、こちらの Twitter アカウントでTHETAプラグインに関する情報を発信していますので、フォローお願いします!