LoginSignup
108

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-01

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のモバイルバッテリーを用意して、持ち運び出来るようにしました。
theta_s.png

概要

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

theta_s_preview.png

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
108