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
- TOSHIBAのHDMI to CSI-2 変換チップTC358743を搭載した製品
- TC358743用のコードは、すでにラズパイのファームウェアに入っているが、実験的なものであり、正式にサポートされているものではない
- 転送帯域の制限から1080/30pまでしか対応していない (60pはもちろん、60iにも未対応)
とのことだ。それでも僕のニーズには合うので、Auvideaのサイトを参照し、メールで注文。その時は半額セールだったので2つ行っといた。Paypalで代金(DHL料金込で175.60EUR)を支払うと、1週間とかからず到着。おそらく小さな企業だろうに、素早い対応。こういうことはね、気持ちが盛り上がっているうちに試せないといかんのです。
※配達受け取り時に2500円ほどの関税を支払った。
左から今回のブツ(B101)、ラズパイ公式カメラ、SDカード。
見て分かるように、ラズパイ公式カメラと同じ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を使う例があり、それらを参考にさせてもらって、改善して行くことにしよう。
続編
その他の参考文献・リンク
THETA SをRaspberryPi2に接続したら自動的にustreamに配信するようにしてみた - Qiita
Raspberry PiカメラでUDPストリーミング | MechMuro