Raspberry Pi Zeroでカメラストリーミングを構築する際、CPU負荷は常に悩みの種だ。リソースに制約のあるシングルコアのARMプロセッサーで、高画質の映像をリアルタイム処理するのは容易ではない。
Vladimir Sobolev氏がGitHubで公開しているmjpg-streamerのフォーク版は、この問題に対するアプローチの一つとなる。オリジナルのmjpg-streamerはTom Stöveken氏が開発した軽量MJPEGストリーミングサーバーで、組み込みデバイス向けに設計された。OctoPrintでの3Dプリンター監視やホームオートメーションで広く使われており、Linux-UVC対応のWebカメラからJPEGフレームを取得してHTTP経由で配信する。
Sobolev氏のフォーク版では、TurboJPEGライブラリを必須としている。標準のlibjpegと比較して、JPEGのデコード処理が3〜5倍高速化されるという。加えて、SIMD命令(x86ではSSE2、ARMではNEON)を活用したメモリー操作の最適化、静的バッファの事前割り当て、Mutexロック時間の短縮といった改良が施されている。READMEによると、Raspberry Pi Zeroで1920×1080ピクセル/30fpsの映像をモーション検出付きでストリーミングした場合、CPU使用率は15〜20%に収まる。従来版では60〜80%程度だったとされており、25〜30%の削減効果があるという。
特徴的な機能として、ゾーンベースのモーション検出がある。画面を2×2、3×3、または4×4のグリッドに分割し、各ゾーンに0〜9の重み付けを設定できる。0は無視、1〜9は検出感度の倍率として機能する。コマンドラインでは「–zones 3_010010011」のように指定する。この例では3×3のグリッドで、数字の並びは左上から右下への各ゾーンの重みを表している。中央と下部の一部だけを監視対象とし、それ以外は無視するといった設定が可能だ。監視カメラ用途では、木の葉が揺れる部分や通行人が常に映る部分を除外し、玄関や窓など重要なエリアだけを監視対象にできる。モーションを検知するとWebhookで通知を送る機能も備えている。
このほか、macOS向けにAVFoundation APIを使用するinput_avfプラグインを新たに追加し、MacのカメラからMJPEGストリーミングが可能になった。RTSPストリーミングにも対応しており、同じポートでHTTPスナップショットも取得できる。ビルドにはcmake、libjpeg-dev、libturbojpeg-devが必要となる。Raspberry Pi Zero向けには、シングルコア最適化のビルドオプション(-O1フラグ、スタック保護の無効化)が用意されている。