« Raspberry PiでYouTubeライブが止まる理由ーその2 | トップページ | PythonでMySQLを操作する - CentOS7/Python2の話 »

2020年12月30日 (水)

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カメラ映像が表示された。

S0011

めでたし、めでたし。

追記:

640x360よりも1280x720で見たくなるのが人情、でワークロード的にどうなるかMonitorixでみてみた(StartスクリプトのSizeを変更)。
ちょっと見ずらいので解説。

12301

メモリー状況で直近から遡ると階段状にダウンしている所があるけれども(下図)そこが640から1280に切り替えたポイント。つまり、1280にしたことで負荷が下がった訳だ。これはカメラが1280だってことに由来するのではないかと思う。640にするには変換が必要だけれど、1280だったらそのままスルーで通せるから。
12302

というこで、カメラ仕様である1280でそのまま流すのが良いってことが判明。

追記その2:

一晩走らせてみた。結果は良好。当然のことながらメモリーリークは発生していないようだし、CPU負荷も十分に小さい。これならCPU発熱も少ない。

System LoadとMemoru:17:00 に1280でストリーミング開始。
M001

CPU Utilization:
M002

Raspberry Pi Temperature:
M003

無事迎えた朝の様子。1280x760 2fps。stream_simpeple.htmlにヘッダーh1を追記したもの。

M004

これなら使えそうだ。

追記その3

Disk I/Oが発生していない。SDカードが摩耗しない。これはいい。

M005

« Raspberry PiでYouTubeライブが止まる理由ーその2 | トップページ | PythonでMySQLを操作する - CentOS7/Python2の話 »

ラズパイ日記」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« Raspberry PiでYouTubeライブが止まる理由ーその2 | トップページ | PythonでMySQLを操作する - CentOS7/Python2の話 »