「ピントがあってるかわかりにくい」「カメラの設定ができない」「撮った写真を回収するのが面倒」といった問題点を解決するために、Webサーバーの機能を組み込んでみた
プレビューの実装
ピントがあってるかわかりにくいので、gstreamerでキャプチャした画像をjpeg圧縮してmjpegとして送りつけるように実装。ついでにAPIにPOSTすることで輝度とコンスタントを変えられるように修正。
サンプルをもとに実装したんだけど、どうも安定しない。Windowsで実行したときは動くんだけど、Raspberry PIに持っていったら、スマホから接続するとメモリエラーで落ちる。gdbで落ちた瞬間を拾ってみても、突然虚無から呼ばれて落ちたようにしか見えない……ちなみにPCから接続すると安定して動く。なんでや。
gstreamerでキャプチャした映像をmongoose.c経由でブラウザにストリーミングするプログラム書いてるんだけど、Windowsでビルドしてたときには安定していたのに、raspberry piでビルドしたらスマホから接続した瞬間SIGSEGVするし、bt見てもわからん…… pic.twitter.com/PLErwa0dmL
— まっちゃん (@mattyan_1117) September 18, 2022
ここらへん、マルチスレッドで書いてるからなにかミスってるんだろうなとは思うんだけど、どこがまずいのかわからん。次の修正でいろいろいじってみるか
ファイルビュワー
「撮った写真の改修が面倒」を解決するためにファイルビュワーを実装。
といっても、javascriptから叩いたらファイルリストをJSONで返すAPI作ってあとはjavascripに全部お任せ。JSON作るのも
if (std::filesystem::is_directory(search_dir)) {
for (const std::filesystem::directory_entry &entry: std::filesystem::directory_iterator(search_dir)) {
ss << ", {\"name\": " << entry.path().filename() << ", \"directory\": ";
if (entry.is_directory()) {
ss << "true";
} else {
ss << "false";
}
ss << "}";
}
}
mg_http_reply(
connection,
200,
"Content-Type: application/json\r\n",
"[{\"name\": \"..\", \"directory\": true}%s]", ss.str().c_str()
);
と、わりと力ずく。
こちらはスマホからの接続でも安定して動く。
次はコードの整理しながらスマホからプレビューすると落ちる原因が……わかるといいなぁ……