honeylab's blog

各種ハードウェアの改造、主にファミコンミニなどをやってます(ました)

続々・ATOMCam2が(中略)RTSPサーバ機能を追加した(パッケージ更新)

こちらの機能を統合した新パッケージを作成しました。

↓こちらの記事が最新のパッケージになります。

honeylab.hatenablog.jp

 

このアプリの使用条件は特にありませんが、こういったものを作るにあたっては突発的にアマゾンで何かを買うことができる資金があることは大変助けになります。

もしアマゾンで何か買うことが多い利用者の方は、是非上記のリンクから入って買い物をしていただくと、売り上げの一部が私に還元されますので是非。

以下の記事は技術情報として残しておきます。

 

サーバパッケージを更新しました。

drive.google.com

どうしてもメモリが足りない状態が多いので、やむなくSDカード上にswapファイルを作成しました。
SDカード上へのswapはちょっと思うところがないわけではないですが、まぁSDカードにはずっと録画データを書いているわけなのと、そこまで頻繁にswapしているというわけでもなさそうなのでしばらくこれで様子見てみます。

念のため、高耐久性で、でも壊れてもいいSDカードを使用してください。

 ーーーーーーーーーー

refererからfacebook辺りから人が来てるっぽいんですが、どこで紹介されてるかわからないので、もしよければコメントから教えてください

(ニッチな用途なので、ある程度ユーザを把握したいです)

ーーーーーーーーーーー

 

honeylab.hatenablog.jp

 

honeylab.hatenablog.jp

 

上の2記事からの続きです。

あれやこれや調べた結果、かなり力技ですが、タイトル通りRTSPサーバ機能を追加し、
ローカルLAN内でVLCなどのRTSPビューアで表示ができるようになりました。

 

もちろん、ルータの設定などを行えば外からも見ることが可能です。
実行ファイル群はATOM CamのOEM元の系統であるWyzeCamのオープンファームウェア「OpenMiko」からの拝借です。

github.com


(手元でT31用のSDKを使ってパッチ・再コンパイルしています)
「OpenMiko」の本来の使い方では完全にファームウェアを入れ替えてしまうため、これと同じように作るともともとの便利なATOMCamのどこからでも見れる機能が使えなくなってしまいます。
それはそれで不便なため、元の機能をうまいこと残し、追加機能を共存させることに成功しました。

ATOM Cam2で使うためには、microSDカードにここにあるアーカイブ内の「Test.tar」と各種フォルダを置いて、カメラを起動するだけでこの機能が使えるようになります。

 

f:id:honeylab:20210705121130p:plain



本体上のストレージには何の影響も与えませんので、microSDカードを抜いて再起動すれば、完全に元の状態で動くようになります。

一応おいておくので試してみてもいいですが、
動かなかったら、あぁ動かなかったな、忘れよう。と思っておいてください。

また、動体検知等の機能はOFFのほうがよさそうです。メモリが足りないです。


尚、この実行ファイルはmicroSDカードに置かれるので、アプリから「microSDカードのフォーマット」をすると、たぶん動作がおかしくなりますので、これだけはやらないように注意する必要があります。
(もちろん、microSDカードを抜いて再起動すれば元通りになりますし、改めてファイルを書き戻せばハック状態にできます。)

 配信されているIPアドレスは、ATOMCamの公式アプリを起動して、デバイス情報の中にある「IPアドレス」になります。

VLCで開くアドレスは rtsp://[IPアドレス]:8554/unicast になります。

f:id:honeylab:20210705121537p:plain

 なお、現時点ではストリームできるのは画像のみです。

 

さて、この実装に関して肝となるのはOpenMikoにも入っている「v4l2loopback」というカーネルモジュールです。

github.com

 

このモジュールを使うと、システム内に任意の /dev/video[x] デバイスを作成することができ、このデバイスに画像データを流し込むことで、通常のLinuxで使用される、/dev/videox をキャプチャデバイスとして扱うようなプログラムに画像を渡す、いわゆる「バーチャルカメラ」や「仮想キャプチャデバイス」などと呼ばれるもの相当が実現可能になります。

あとは、ATOM Camのプログラムの起動時に仕掛けをして、カメラから画像データが到着するたびに、この仮想キャプチャデバイスにデータを渡し、バックグラウンドで一般的に使われているRTSPサーバ「v4l2rtspserver」

github.com

を動かせばいいだけです。

(↓参考リンク)

dev.classmethod.jp

カメラ内のプログラムに仕掛けをしているコードはこんな感じです。

gist.github.com

 

ここで少し課題があります。

今のところ割り込んで画像を取得しているのは、カメラからの直データではなく、その次に接続されたH264エンコーダの出力になっています。

そのため、おそらく今のところ「mjpg_streamer」(生画像データかJPEGデータが必要)はまだ動かせません。/dev/videoから出てくるデータは生データとは限らないのです。


その代わり、H264エンコードはハードウェアで行われていますので、追加の負荷がほとんど発生しない状態でRTSP配信ができています。

f:id:honeylab:20210705112310p:plain

 

理論上は、カメラ直後のYUVストリーム、うまくいけばハードウェアJPEGエンコード後のストリームも取れるはずなので、それは別デバイスに流してmjpg_streamerに食わすかcgiで吐き出せば、普通のブラウザでJPEG画像としてみることも可能になるはずです。追々挑戦してみたいと思います。

 

 あと、おまけ機能としてtelnetdを上げてあります。
上にあるIPアドレスに、telnetで、ユーザ root パスワード atomcam2でログインできます。

追記:とりあえずJPEG画像を取得する

エンコードされたフレームから再生成するので直接よりは画質が落ちますが、スクリプトなどで実行して送ったりするためにはffmpegを使うといいです。

ffmpeg -i rtsp://192.168.0.18:8554/unicast -f image2 -frames:v 1 test.jpg -y

などとやると、test.jpgが保存されます。