アールテクニカ地下ガレージ

アールテクニカ株式会社の製品開発・研究開発・日々の活動です

Raspberry Pi 2 + HDMI入力 でフルHD をUstreamに配信してみる (1)

Author

koss (社長)

社長の古瀬です。

「ラズパイ用のHDMI入力インタフェース」を作るプロジェクトがKickstarterに登場したので注目していたのだが、その時(2014年4月)は不成立。「ラズパイでHDMIカメラを使ってUst配信をする」という具体的なニーズを抱える僕にはとても残念なことだった。

Connect your HD camcorder to your Raspberry Pi by Auvidea — Kickstarter

2016年になって、同じメーカーが自力で開発、製品化に成功していることを知り、早速入手・テストしてみた。

ブツの入手

ブツはドイツのAuvidea社のB101。

B101 HDMI to CSI-2 Bridge (15 p.)

この辺を読むと分かるが

Raspberry Pi • View topic - HDMI to CSI-2 via TC358743 on kernel 4.1

Raspberry Pi • View topic - Raw sensor access / CSI-2 receiver peripheral

  • TOSHIBAHDMI to CSI-2 変換チップTC358743を搭載した製品
  • TC358743用のコードは、すでにラズパイのファームウェアに入っているが、実験的なものであり、正式にサポートされているものではない
  • 転送帯域の制限から1080/30pまでしか対応していない (60pはもちろん、60iにも未対応)

とのことだ。それでも僕のニーズには合うので、Auvideaのサイトを参照し、メールで注文。その時は半額セールだったので2つ行っといた。Paypalで代金(DHL料金込で175.60EUR)を支払うと、1週間とかからず到着。おそらく小さな企業だろうに、素早い対応。こういうことはね、気持ちが盛り上がっているうちに試せないといかんのです。

※配達受け取り時に2500円ほどの関税を支払った。

左から今回のブツ(B101)、ラズパイ公式カメラ、SDカード。

f:id:kossQ:20160412202944j:plain

見て分かるように、ラズパイ公式カメラと同じ15pinのフラットケーブルが出ている。ラズパイカメラを置き換えてB101を接続することになる。

前述のファームウェア(デバイスドライバ)のおかげで、ラズパイのアプリケーションからは、同等のデバイスに見えると言う寸法だ。

接続テスト

以下、Raspberry Pi2 + Raspbian Jessie 2016-3-18での動作。当然、raspi-configで、ラズパイカメラを有効にしてある。手持ちの家庭用ビデオカメラVictor GZ-E220を繋いで簡単なチェック。

$ raspivid -t 0

 しかし、mmalのエラーを吐いて終了。もちろん、ラズパイに接続したモニターにも画は出ない。「60iには対応していない」ことが明言されていたので、ここはあわてず、同じく家庭用ビデオカメラSONY CX-370をつなぐと正常に画が出る。取り込んだ画がそのままディスプレイに表示されるだけなので、目立ったレイテンシもない。

2011年発売の低価格帯製品であるGZ-E220では60iは出せても30pは出せなくて、同じ時期の製品だけど、もちょっと高いからかSONYだからかCX-370は30pを出してくれる、と言うことだろう。と解釈した。

ちなみに、GoPro(Hero Silver)では本体設定をどのようにしても(おそらく)30pで出力され正常動作、Panasonic LUMIX GH4 ではHDMIの出力を1080/30pにすると、表示はされるが映像が崩れており、1080/24pにすると正常に表示される。iPadからのミラーリングはうまく行くが、外部出力をコントロールするタイプのアプリはうまく動かない。

どのようなEDIDのやり取りがなされているかは確認していないが、HDMIならなんでもOKと言う訳ではなさそうだ。

 Ustream配信

 カメラとの相性はあるものの、動作することが確認できたので、早速Ust配信してみる。ここではGStreamerを使うのでインストール。試作につき、コマンドラインでパイプラインを組み立てる予定なので、GStreamer Toolsも一緒に入れる。

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

ラズパイカメラ入力のソースとなるプラグイン rpicamsrc が必要なので、こちらも別途インストールするのだが、aptパッケージはないので、githubから取ってきてビルドする。

$ git clone https://github.com/thaytan/gst-rpicamsrc.git
$ cd gst-rpicamsrc

#makeのために必要なライブラリ、ツールをインストールする

$ sudo apt-get install dh-autoreconf libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
$ ./autogen.sh --prefix=/usr --libdir=/usr/lib/arm-linux-gnueabihf/
#何か足りないと言われたらインストールして、autogen.shをやり直す

$ sudo make
$ sudo make install

なお、GStreamerを扱うのは初めてなので、ネット上のいろんなサンプルを参考にさせて(文字通り)いただいた。見よう見まねでパイプラインを組み立てて、最終的にはこのようにしたところ、成功した。(GStreamerおもしれえな)

#!/bin/sh

# [url]と[key]はUstreamのダッシュボード→チャンネル設定→(配信対象チャンネル)→ライブ配信設定→エンコーダー設定で確認
RTMP_URL="[url]"
STREAM_KEY="[key]"

FLASHVER='FME/3.0%20(compatible;%20FMSc%201.0)'

LOCATION="$RTMP_URL/$STREAM_KEY live=1 flashver=$FLASHVER"

CMD="gst-launch-1.0 rpicamsrc preview=0 bitrate=10000000 ! video/x-h264, width=1920, height=1080, framerate=30/1 ! h264parse ! flvmux ! rtmpsink location='$LOCATION'"


$CMD

 rpicamsrc は映像をH264ストリームとしてパイプラインに送って来ると言うことらしい。そのビットレートは10Mbps (!!) にしてある。1Mpbsでは映像に動きがあるとノイズが乗りまくるので、大雑把にこのくらいにした。

Ustのクライアント側では、実に美しい、安定したフルHD映像を鑑賞できる。ただ、Ustreamで本当に10Mbpsで送受信出来ているのかは検証していない。

今回は配信サービスとしてUstを使っているが、他のサービスでもrtmpサーバであれば大丈夫なはず。

なお、発売されたばかりのRaspberry Pi 3でもまったく同じ構成で動作することを確認した。

次へのステップ…の前に

割とあっさりと自分のニーズの1つを満たしてしまった。他のニーズ(要件)としては

  • 配信しながらローカルにも保存できる
  • 長時間(月単位で)安定的に動作する

 がある。ローカル保存を試したいところだが、このセットで配信しっぱなしにしておくと、2.5日ほどで止まってしまうことが分かった。gst-launchによるごく簡単な「原理試作」に過ぎないため、エラーハンドリングなど皆無。よって原因は特定できていないが、GStreamerでrtmp配信している他の例を当たってみると、やはり「そのうち落ちる」的な記述を見かける。

rpicamsrc の代わりにraspivid の出力を使う例や、rtmpsinkの代わりにnginxを使う例があり、それらを参考にさせてもらって、改善して行くことにしよう。

続編

artteknika.hatenablog.com

 

その他の参考文献・リンク

THETA SをRaspberryPi2に接続したら自動的にustreamに配信するようにしてみた - Qiita

Raspberry PiカメラでUDPストリーミング | MechMuro

gst-rpicamsrc | Sparky Flight

 

Author

koss (社長)

アールテクニカ株式会社 代表取締役。株式会社エイガアルライツ取締役として漫画『コブラ』などの寺沢武一作品を世に送り出すプロデューサーでもある。 「映画 / 音楽 / 生き物 / 宇宙 x IT」を人生のテーマとする。 昆虫の変態専門チャンネル「コーカサスTV」をUstreamにて配信中。みんな見てくれよな!

スポンサーリンク