春雨日記 about me tags

G-Clusterを監視カメラ化すべく,cam2webをクロスコンパイルしてみました.

はじめに

Webカメラをストリーミングする手法は,MotionやMJPEG_Streamerを使った方法が有名です.

しかし,これらのソフトウェアはそれなりにマシンパワーを必要とします.G-Clusterで動作させたところLoad Averageが1を超えてしまったり,出力される映像がカクカクになってしまうなどの問題点がありました.

また,Motionは元々動体検知機能が売りとなっており,Alpineのレポジトリからダウンロードできる物はffmpegやwebpなどいろいろ付いた80MB程度のパッケージとなってしまっています.

削った物をコンパイルできるのはできるのですが,それよりもストリーミングに特化したソフトウェアを見つけたので,試してみる事にしました.

cam2web

https://github.com/cvsandbox/cam2web

MJPEGとしてWebカメラの映像をストリーミングする事ができます.

ここだけ見るとMJPEG_Streamerと変わらないですが,実装の差なのか動作が軽量でした.

かなり軽量なので,Raspberry Piユーザにもおすすめしたいです.

クロスコンパイル

前提事項

前書いたffmpegと同じ手順でchroot環境を用意して下さい.

必須パッケージをインストール

1
2
3
4
apk add alpine-sdk
apk add libjpeg-turbo libjpeg-turbo-dev
apk add linux-headers
apk add git

cam2webの用意

1
2
git clone https://github.com/cvsandbox/cam2web.git --depth 1
cd cam2web

Building cam2webを参考にしながらビルド

GCCにarmv6向けビルドを作るよう指示する必要があります.(qemu-staticではarmv7になる)

1
-march=armv6z -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard

CFLAGSに付ければ大丈夫です1

web2h

1
2
3
4
cd src/tools/web2h/make/gcc
nano Makefile
# 下記の内容に書き換える
make

Makefile↓

1
2
3
4
5
# Compiler to use
COMPILER = g++
# Base compiler flags
# add armv6 target
CFLAGS = -O2 -s -DNDEBUG -std=c++0x -march=armv6z -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard

本体

1
2
3
4
cd ../../../../apps/linux/
nano Makefile
# 下記の内容に書き換える
make

Makefile↓

1
2
3
4
5
6
7
8
# Compiler to use
COMPILER = g++
# Base compiler flags
# add armv6 target
CFLAGS = -std=c++0x -march=armv6z -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard

# Object files list
OBJ = $(SRC_CPP:.cpp=.o) $(SRC_C:.c=.o)

動作

build/gcc/release/に生成されるので全てをG-Clusterに転送し,実行すれば動きます.

ファイルサイズはかなり小さく,NANDに十分収まります.

また,Load Averageも常に低めなので低スペG-Clusterでは有り難いです.