RAPIROの視点を楽しむ 〜カメラでいろいろ遊ぶ②〜

前回は静止画だったので、今回は動画です。通常の動画の撮影&閲覧を試した後、ライブ映像の配信もできるようにしたいと思います。

1. 動画を撮影

静止画同様、撮ること自体は非常に簡単です。コマンドがraspistillからraspividに変わるだけで、例えばこんな感じです。

$ raspivid -w 640 -h 480 -rot 180 -o Video/sample_movie.h264 -n -t 10000

各オプションの意味は静止画のときとほぼ同じですが、-tのみ、撮影までの時間から、撮影時間に意味が変わっています。

 

さて、これで前回と同じようにスマホのDLNAアプリで見ようとすると…動画が発見できません。よくわかりませんが、どうも拡張子が.h264のファイルは発見してくれないみたいです。

DLNAに拘らなければ、素直にRaspberry Piの画面上でomxplayerで再生すれば良いだけの話なのですが、せっかくなのでDLNAで見られるようにします。拡張子だけ変えてみたところ、.mp4なら発見されたので、h264で保存された動画をちゃんとmp4に変換してやれば問題なさそうです。ということで、以下です。

$ sudo apt-get update
$ sudo apt-get install gpac

インストールすれば、以下のコマンドで動画を変換できます。

$ MP4Box -add Video/sample_movie.h264 Video/sample_movie.mp4

これで、静止画のときと同じようにして動画が参照できるようになったハズです。

 

2. ライブ映像を配信

何やら『MJPG-streamer』とやらを使えば、PCやスマホからブラウザでライブ映像が見られるようです。Ustreamみたいな世界中の人への配信用には使えないみたいですが、今のところその予定はないので問題なしです(そういう目的には、別途『ffmpeg』というソフトがあるみたいです)。Raspberry Piの専用カメラモジュールとMJPG-streamerを組み合わせたライブ映像配信については以下に詳しく書かれているので、大いに参考にさせていただきます。

というわけで、MPEG-streamerのインストールです。

$ sudo apt-get install subversion libjpeg-dev imagemagick
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
$ cd mjpg-streamer
$ make
$ sudo make install

今回のやり方では、「動画を配信する」というよりは「定期的に撮影した写真を連続で送り続ける」という形になるので、一時的に写真を保存するフォルダを作ります。

$ mkdir /tmp/stream

この後は、

  1. raspstillで定期的に写真撮影開始
  2. mjpg-streamerを立ち上げて配信開始

となるのですが、どちらもちょっとコマンドが長いので、まとめて実行するためのスクリプトを書きます。

#!/bin/sh
raspistill -w 640 -h 480 -rot 180 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
export LD_LIBRARY_PATH=/usr/local/lib
mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w /usr/local/www -p 8080" &

1行目で、定期的な写真撮影を開始します。-qでJPEGのクオリティを(0〜100の中で)5に指定しているのは、ファイルを軽くしてフレームレートを上げるためです。-tlで撮影間隔をしています。今回は100msなので、フレームレートは10fpsになります。-tは撮影時間の指定なので、とりあえず2時間半ぐらいを指定しています(実際はそこまで長時間撮影はせずに、途中でプロセス終了させてしまいますが)。-thはサムネイルの指定らしいですが、特にいらないので全部0にしています。最後に、&を指定してバックグラウンドで動作させます。

2行目は、先にインストールしたMJPG-streamerの共有ライブラリへの参照を設定しています(3行目の実行に必要になる)。毎回設定しなくても良い方法はあると思いますが、今回はとりあえずこれで。

3行目で、MJPG-streamerが映像の配信を開始します。-iの引数の指定によって、/tmp/streamの中の画像が更新されるたびに配信してくれるようになるみたいです。詳しくはこちらを参照してください。これも、最後に&を指定してバックグラウンドで動作させます。

ついでに、配信を停止させるためのスクリプトも一緒に作っておきます。

#!/bin/sh
killall raspistill
killall mjpg_streamer

スクリプトができたら、パーミッションを変更して、実行します。

$ chmod 755 stream_start.sh
$ chmod 755 stream_stop.sh
$ ./stream_start.sh

実行すると、こんな感じでログが流れて行きます。

pi@raspberrypi ~ $ ./stream_start.sh
pi@raspberrypi ~ $ MJPG Streamer Version: svn rev: 3:172
 i: folder to watch...: /tmp/stream/
 i: forced delay......: 0
 i: delete file.......: no, do not delete
 i: filename must be..: -no filter for certain filename set-
 o: www-folder-path...: /usr/local/www/
 o: HTTP TCP port.....: 8080
 o: username:password.: disabled
 o: commands..........: enabled
mmal: Skipping frame 2 to restart at frame 6
mmal: Skipping frame 7 to restart at frame 12
mmal: Skipping frame 13 to restart at frame 18
mmal: Skipping frame 19 to restart at frame 24
mmal: Skipping frame 25 to restart at frame 31
mmal: Skipping frame 32 to restart at frame 37

これでもう配信が始まっているハズですので、PCでもiPhoneでもAndroidでも何でも良いのでブラウザを立ち上げて、

http://xxx.xxx.xxx.xxx:8080/

(xxx.xxx.xxx.xxxはRaspberry Piのアドレス)

にアクセスしてください。トップページが表示されるので、左にあるメニューの”Stream”を押してもらえば、1s遅れぐらいでカクカクした感じですが、一応ライブ映像が配信されます。iPhoneで見ると、こんな感じになります。

th_stream_sample

トップ画面が表示されない(404 Not Found)場合は、-o “output_http.so -w /usr/local/www -p 8080″ の部分が環境によって違うのかもしれません。

配信を止めるときは、

$ ./stream_stop.sh

です。どんどん文字が流れていってしまいますが、気にせず正確に打ち込んで実行すれば止まります。ログがどんどん流れていくのが嫌な場合は、stream_start.shの一行目を以下のように変更すれば、ログが表示されなくなります。

$ raspistill -w 640 -h 480 -rot 180 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 > /dev/null 2>&1 &

後ろにおまじないがついています。バックグラウンドで実行されているジョブの出力を表示させないための、Linuxでの一般的な書き方のようですが、ここでは深く追求しません。

 

またまた長くなってしまったので、今回はここまでにします。長い下準備になってしまいましたが、次回、いよいよRAPIRO+カメラで何が見えるかをみてみたいと思います。


「RAPIROの視点を楽しむ 〜カメラでいろいろ遊ぶ②〜」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>