mjpg-streamerでUSBカメラをストリーミング配信してみる
Raspberry Piで自己完結型のStreamingを行ってみることにした。この世界なかなか良くわかっていないけれども、いろいろ先人の知恵を読ませていただくとmjpg-streamerが簡単そうに思えたのでそれで試すことにした。
まず、mjpg-streamerのインストールから。パッケージ化されていないとのことで、subversionからコードダウンロードする方法に倣った。
$ sudo apt-get update
$ sudo apt-get install -y subversion libjpeg-dev imagemagick
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
$ cd mjpg-streamer
$ make
ところが、以下のエラーに遭遇。ヘッダーファイル内のstructure定義が重複しているようだ。足らないのであれば探すこともできるけれど重複は難解に思える。
pi@raspberrypi:~/mjpg-streamer $ make
gcc -D'SVN_REV="3:172"' -O2 -DLINUX -D_GNU_SOURCE -Wall -c -o utils.o utils.c
In file included from /usr/include/arm-linux-gnueabihf/sys/stat.h:446,
from utils.c:33:
/usr/include/arm-linux-gnueabihf/bits/statx.h:25:8: error: redefinition of ‘struct statx_timestamp’
struct statx_timestamp
^~~~~~~~~~~~~~~
In file included from utils.c:32:
/usr/include/linux/stat.h:56:8: note: originally defined here
struct statx_timestamp {
^~~~~~~~~~~~~~~
In file included from /usr/include/arm-linux-gnueabihf/sys/stat.h:446,
from utils.c:33:
/usr/include/arm-linux-gnueabihf/bits/statx.h:36:8: error: redefinition of ‘struct statx’
struct statx
^~~~~
In file included from utils.c:32:
/usr/include/linux/stat.h:99:8: note: originally defined here
struct statx {
^~~~~
make: *** [<ビルトイン>: utils.o] エラー 1
恐らく同様の問題に遭遇された先人も居るだろうと調べてみるとsvnからgitに切り替えることで乗り切っているようだ。確かに最近はgitだよねぇ、って思いながらtestディレクトリを作ってgitにてコードを展開。
$ sudo apt-get install -y cmake libv4l-dev libjpeg-dev imagemagick
$ mkdir ~/test
$ cd ~/test
$ git clone https://github.com/jacksonliam/mjpg-streamer.git $ cd mjpg-streamer/mjpg-streamer-experimental
$ make
このmakeは成功。以下でプロジェクトをインストール。
$ sudo make install
mjpg-start.shを mjpg-streamer-experimentalディレクトリに作成する。といっても基本的に先人の知恵をコピペしただけ。
#!/bin/sh
PORT="8090" #ポート番号
ID="user" #ID
PW="password" #パスワード
SIZE="640x360" #画面サイズ
FRAMERATE="2" #フレームレート
export LD_LIBRARY_PATH=/usr/local/lib
./mjpg_streamer \
-i "input_uvc.so -f $FRAMERATE -r $SIZE -d /dev/video0 -y -n" \
-o "output_http.so -w /usr/local/www -p $PORT -c $ID:$PW"
ドキドキしながらBrowserで localhost:8090 を実行するとエラー。
404: Not Found!
Could not open file
Could not find a fileではなくてCould not open file、、、これはディレクトリーの不整合か?
で、あらためて make installのアウトプットを見てみると以下となっている。
-- Installing: /usr/local/lib/mjpg-streamer/www/stream.html
つまり -wオプションで指定しているディレクトリは/usr/local/wwwではなくて/usr/local/share/mjpg-streamer/wwwということだ。で、スクリプトの対象ラインを以下の通り書き換えた。
-o "output_http.so -w /usr/local/share/mjpg-streamer/www -p $PORT -c $ID:$PW"
ブラウザーで確認:
localhost:8090
Streamを選択するとUSBカメラ映像が表示された。
めでたし、めでたし。
追記:
640x360よりも1280x720で見たくなるのが人情、でワークロード的にどうなるかMonitorixでみてみた(StartスクリプトのSizeを変更)。
ちょっと見ずらいので解説。
メモリー状況で直近から遡ると階段状にダウンしている所があるけれども(下図)そこが640から1280に切り替えたポイント。つまり、1280にしたことで負荷が下がった訳だ。これはカメラが1280だってことに由来するのではないかと思う。640にするには変換が必要だけれど、1280だったらそのままスルーで通せるから。
というこで、カメラ仕様である1280でそのまま流すのが良いってことが判明。
追記その2:
一晩走らせてみた。結果は良好。当然のことながらメモリーリークは発生していないようだし、CPU負荷も十分に小さい。これならCPU発熱も少ない。
System LoadとMemoru:17:00 に1280でストリーミング開始。
無事迎えた朝の様子。1280x760 2fps。stream_simpeple.htmlにヘッダーh1を追記したもの。
これなら使えそうだ。
追記その3
Disk I/Oが発生していない。SDカードが摩耗しない。これはいい。
« Raspberry PiでYouTubeライブが止まる理由ーその2 | トップページ | PythonでMySQLを操作する - CentOS7/Python2の話 »
「ラズパイ日記」カテゴリの記事
- NEO-7M GPSモジュールが中国から届いた(2023.01.15)
- TNCアプリにおけるDemoduatorの動作確認(2023.01.09)
- AFSKでの復調について(2023.01.04)
- APRSでのNRZIについて備忘録(2023.01.02)
- pico_tnc 2200Hz(Space)でPhaseをずらす件の備忘録(2022.12.31)
« Raspberry PiでYouTubeライブが止まる理由ーその2 | トップページ | PythonでMySQLを操作する - CentOS7/Python2の話 »
コメント