Edited at

THETA S + Raspberry Pi 2でライブストリーミングしてみた

More than 3 years have passed since last update.


THETA S + Raspberry Pi 2でライブストリーミングしてみた


前書き

こんにちは、syumaiです。

現在、DUCKLINGS Inc.と言う会社で研究開発のアルバイトをしています。

DUCKLINGSでは、遠隔地にいる体の不自由な方とのコミュニケーションを、VR技術で解決しようというHUG Projectに取り組んでいます。

今回、その一環としてTHETA Sを利用した動画配信について調査を行いました。


本題

THETA Sの映像をRaspberry Pi 2にUSB経由で取り込み、

無線LAN経由で、同じネットワーク内のPCにRTPで配信します。

※…HDMIのキャプチャーは大きな困難が伴いそうなので、今回の範囲外となります。Advent Calendarの他の日に誰かがやってくれるかと…笑


必要なもの


  • PC(受信用)

  • THETA S

  • Raspberry Pi 2 一式(Raspbian環境)

配信側を無線にしたい場合は、以下の物を準備する必要があります。


  • USB接続のWiFi子機

  • モバイルバッテリー

今回は、Buffaloの無線LANアダプタ、Panasonicのモバイルバッテリーを用意して、持ち運び出来るようにしました。


概要

USBカメラとして認識したTHETA Sの映像を、

OpenMAXプラグインを利用してH.264にハードウェアエンコードし、

GStreamerを使ってRTPで配信します。


参考にしたページ

raspberry pi で USB camera から h.264 動画 - Qiita (kwiさん)

Raspberry Pi - Gstreamer streaming H.264 with OpenMax


手順


Raspberry Pi 2側

大体kwiさんの記事に書いてある通りですが、

まずはRaspbianと、GStreamerをインストールします。


Raspbianのインストール

多くの方は既にインストール済みだと思いますが、

https://www.raspberrypi.org/downloads/raspbian/

からダウンロードしてSDに書き込みます。

今回はJessie(2015-09-24)を使いました。


GStreamerのインストール

sudo apt-get install gstreamer1.0 gstreamer1.0-tools


THETA Sの接続

THETA SをLiveモードにして接続します。

(モード切り替えボタンを押しながら電源をONにし、USB接続)

v4l2(Video for Linux 2)を使用し、カメラとして認識されたか確認します。

v4l2-ctl --list-devices

出力

RICOH THETA S (usb-bcm2708_usb-1.4):

/dev/video0

今回は、/dev/video0がTHETA Sの(カメラデバイスとしての)パスになっていることがわかりました。

(他に接続しているカメラがあれば、video1やvideo2になっている場合があります。)

Failed to open /dev/video0: No such file or directory

この様に表示されたら、THETA Sを接続し直してください。

次に、THETA Sで利用できるビデオの取り込み形式を確認します。

-d /dev/video0でデバイスをTHETA Sとして指定し、そのフォーマットを表示します。(video0の場合、デバイスの指定は省略可能です)

v4l2-ctl -d /dev/video0 --list-formats

出力

ioctl: VIDIOC_ENUM_FMT

Index : 0
Type : Video Capture
Pixel Format: 'MJPG' (compressed)
Name : MJPEG

--list-formats-extオプションで、画像の解像度とフレームレートも確認可能です。

v4l2-ctl -d /dev/video0 --list-formats-ext

出力

ioctl: VIDIOC_ENUM_FMT

Index : 0
Type : Video Capture
Pixel Format: 'MJPG' (compressed)
Name : MJPEG
Size: Discrete 1280x720
Interval: Discrete 0.067s (14.985 fps)

1280x720の約15fpsで、MJPG形式の画像を取得出来ることが確認出来ました。


プレビュー

配信に使うツールが正しくインストールされているか、gst-inspect-1.0で確認します。

$ gst-inspect-1.0 | grep v4l2src

video4linux2: v4l2src: Video (video4linux2) Source

$ gst-inspect-1.0 | grep omxh264
omx: omxh264enc: OpenMAX H.264 Video Encoder
omx: omxh264dec: OpenMAX H.264 Video Decoder

v4l2src, omxh264encがあればOKです。

※…OpenMAXのエンコーダを利用すると、Raspberry Pi 2のSoCに内蔵されたエンコーダが走るので、高速に動画の圧縮ができる(らしい)です。これを使わないと、尋常じゃない遅延と、低フレームレートに苦しむ事になります…。

ここで一度、THETA Sの動画が正しく表示出来るか確認します。

sshでRaspberry Pi 2に接続している場合は、この手順はスキップしてください。

(例によってdevice='/dev/video0'は省略可)

gst-launch-1.0 v4l2src device='/dev/video0' ! autovideosink

物凄いフレームレート低い(&遅延あり)ですが、画面にTHETA Sの映像が表示されると思います。

ここまででRaspberry Pi 2側での確認は終了です。


PC側(Mac)

Homebrewで、GStreamerを各種プラグインとセットでインストールします。

brew install gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav


配信

今回、ポート番号は1234としておきます。


PC側(Mac)

こちらを入力して待ち受けます。

gst-launch-1.0 udpsrc port=1234 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" ! rtph264depay ! avdec_h264 ! autovideosink sync=false


Raspberry Pi 2側

以下の内容を、stream.shなどの適当な名前のファイルとして保存してください。

(chmod +x ./stream.shで実行権限を付けるのを忘れずに)

gst-launch-1.0 v4l2src ! videoconvert ! omxh264enc ! rtph264pay pt=96 config-interval=1 ! udpsink host=$1 port=$2

第一引数に送信先のIPアドレス、第二引数にポート番号を渡して実行します。

./stream.sh {送信先IPアドレス} 1234

PC側に映像が表示されました!


終わりに

ひとまず、これでRTPでの動画送信は出来ました。

無線環境下でも使えるので、結構取り回しが良いです。

GStreamerの使い方はまだあまり良くわかっていない(と言うより、ほとんどわかっていない…)ので、突っ込みどころなどありましたらどうぞよろしくお願いします…m(_ _)m

今度は、受信した動画をUnityで表示するものを作ってみようと思います。(Oculusで見れたらいいな…)


追記

1月末のTHETA S Advent Calendar LT大会にて発表した、

『THETA S + Raspberry pi 2でライブストリーミングしてみた(続) 』のスライドをアップしました。

http://www.slideshare.net/ShuichiroFukuoka/theta-s-raspberry-pi-2