2017年7月25日火曜日

raspiカメラの映像をrtsp形式で配信する方法


メモを共有します。

動機

raspberry pi + raspiカメラの組み合わせで取得できるデータを、webカメラなどに使われるrtsp形式で配信する方法を知りたかったので、調べて試してみました。

使ったもの

raspberry pi3



試した内容はzeroやB+など、ほかのラズパイにも適用できると思います。

raspberry piカメラ


aliexpressで魚眼レンズ付きで、暗視カメラにもなるものを買いました。

配信するデータを確認するためのPC

vlcメディアプレーヤーで動画を受信します。

ビルド無しで実現

送信準備

vlcの機能を使えば、ビルドする必要のあるツールより処理が重たいですが、apt installだけで準備できます。
sudo apt install vlc

送信

vlcをダウンロードできたら、下記のコマンドで配信出来ます。
コマンドの内容としては、raspividというraspiカメラ用の(多分GPUで高速化されている)コマンドを利用してデータを作り、vlcの機能を利用して配信しています。
raspivid -o - -t 0 -n | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

raspividにオプションを指定すれば、画像サイズやフレームレートを変更できます。
下記のコマンドは600x400の画像を12fpsで配信しようとしています。
raspivid -o - -t 0 -n -w 600 -h 400 -fps 12 | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

これにより、rtsp://xxx.xxx.xxx.xxx:8554/ で動画を配信できているはずです。
(xxx.xxx.xxx.xxxはraspberry piのipアドレスです。ipはifconfigコマンドで確認できます。)

受信

raspberry piのrtspのアドレスから配信されるデータを受信します。
今回はvlcメディアプレーヤーを使いました。
PCに入っていない方はインストールしてください。

「メディア」 -> 「ネットワークストリームを開く」を選んでメニューを開きます。


raspberry piの動画配信アドレスを入力します。
アドレスの終わりにはスラッシュ「/」が必要です。
rtsp://xxx.xxx.xxx.xxx:8554/


成功すると、画像を確認できます。


自分の環境だと、600x400 12fpsの動画を時差3秒位で受信できました。

参考

Streaming Video Using VLC Player

ビルドして実現

ビルドするツールを使うと配信時のタイムラグを減らせるということだったので、こちらの記事に紹介されてたツールを利用してみました。
これを使うと2秒くらいのタイムラグで配信できるようになり、ビルド無しで実現した時よりもラグが小さくなり、送信内容も安定するようでした。

送信準備

raspiカメラをv4l(video for linux)というライブラリで扱えるようにするために、下記のコマンドでビルド・インストールします。
sudo apt-get install autoconf gettext libtool autoconf git
cd ~/
git clone git://git.linuxtv.org/v4l-utils.git
cd v4l-utils
./bootstrap.sh
./configure
make
sudo make install
これによって、bcm8235-v4l2をロードすると、/dev/video0としてrasp cameraを認識できるようになりました。

raspiカメラ用のポートが準備できたら、今度はポートの出力をrtspとして配信するためのv4l2rtspserverを下記のコマンドでビルド・インストールします。
sudo apt-get install cmake
cd ~/
git clone git@github.com:mpromonet/v4l2rtspserver.git
cd v4l2rtspserver
cmake .
make
sudo make install
これによって、h264_v4l2_rtspserverコマンドが使えるようになりました。

送信

下記のコマンドでraspiカメラを扱うためのポート(/dev/video0)を開けます。
sudo modprobe bcm2835-v4l2

下記のコマンドでrtsp形式(デフォルトは640 x 480, 25fps)で動画を配信出来ます。
h264_v4l2_rtspserver

オプションを指定することで画像サイズやfpsを変えられます。
h624_v4l2_rtspserver -W 600 -H 400 -F 12

これにより、rtsp://xxx.xxx.xxx.xxx:8554/unicast で動画が配信されるはずです。
(xxx.xxx.xxx.xxxはraspberry piのipアドレス)

受信

ビルドなしで受信した時と同様にvlcメディアプレーヤーにraspberry piのアドレスを指定して、データを受信します。
v4l2rtspで配信するアドレスにはipアドレスに「/unicast」が付きます。


自分の環境だと、600x400px 12fpsを時差2秒位で受信できました。

参考

raspberry-spycam
v4l2rtspserver

まとめ

rtsp形式でraspiカメラの画像を配信できました。
自分の感想としては、こんな感じです。

良い点
  • aptでインストールするツールで、とりあえず試せる
  • ビルドしたツールで配信する方法だと、motion jpegに比べて高いフレームレートで送信できる

気になる点
  • 時々キーフレームの送信か受信に失敗することがあるのか、2秒くらい灰色の画面になることがある
  • フレームレートを1桁(6とか2とか)に落とすと、配信が不安定になる(不思議です。)


個人的には、ツールをビルドして600x400px 12fpsで配信するのが、試した中では大きめの画像サイズで安定しているように感じました。

共有する情報は以上です。
もっと安定するrtspの配信方法があれば、情報を共有してもらえると嬉しいです。

0 件のコメント :