Armadilloフォーラム

mjpg_streamer録画によるフレームレートの確認方法

kazu_2012

2014年5月19日 11時02分

以前も質問させていただきましたが、ストリーミング中のフレームレートを確認したいと思っています。
そこで以下の2点が不明確です。

1、mjpg_streamerで録画機能は実装されていないでしょうか。
2、jpegエンコード時にタイムスタンプを画像右下に埋め込み⇒mjpg_streamerでストリーミングとする場合、どのようにソースコードを改良していくといいでしょうか

もっと簡単にフレームレートを確認できる方法がありましたら、コメントお願いします。
※件名に変更が必要であれば、変更お願い致します。

コメント

> 1、mjpg_streamerで録画機能は実装されていないでしょうか。

試したことはないのですが、複数の output plugin を指定できるみたいなので

./mjpeg_streamer -o "output_http.so" -p 80 -o "output_file.so" -f /some/where/to/save/jpeg/files/

とかで、できないでしょうか?

> 2、jpegエンコード時にタイムスタンプを画像右下に埋め込み
> ⇒mjpg_streamerでストリーミングとする場合、どのようにソースコードを改
> 良していくといいでしょうか

atmark-dist/user/mjpg-streamer/mjpg-streamer.r94/plugins/input_uvc/input_uvc.c::cam_thread()

あたりでしょうか。

    if (videoIn->formatIn == V4L2_PIX_FMT_YUYV) {
      DBG("compressing frame\n");
      pglobal->size = compress_yuyv_to_jpeg(videoIn, pglobal->buf, videoIn->framesizeIn, gquality);
    }
    else {
      DBG("copying frame\n");
      pglobal->size = memcpy_picture(pglobal->buf, videoIn->tmpbuffer, videoIn->buf.bytesused);
    }

カメラだ出してくるデーターによって処理が異なりますが、最終的には in か
ら out へ画像をコピーします。out にコピーする前に画像をいじると良いと思
います。

画像に文字を書くのであれば、cairo[1] や imagemagick[2] が良いかと。

[1]:http://cairographics.org/
[2]:http://www.imagemagick.org/

コメントが遅くなり申し訳ありません。
mjpegファイルが出てくるかと思ったのですが、jpegファイルが複数出来上がるところまで確認出来ました。
※確認動作のため, ファイルは/homeに配置しています。
問題は、これらをSDカードに書き込もうと試みたところ、上手くいきません。
※mjpg_stremerから直接出来るのか、確かめているところです

SDカードへのパスは繋がるのですが、ファイルアクセスできないのは何故でしょうか
コメント頂けると幸いです。

[root@armadillo810-0 (pts/0) ~]# ls
sample.txt
[root@armadillo810-0 (pts/0) ~]# cp sample.txt /mnt/
cp: can't create '/mnt/sample.txt': Read-only file system
[root@armadillo810-0 (pts/0) ~]# echo sample.txt > /mnt/
ash: can't create /mnt/: Is a directory
[root@armadillo810-0 (pts/0) ~]# ls /mnt/
linux.bin.gz               romfs.img.gz

中村です。

> cp: can't create '/mnt/sample.txt': Read-only file system

"Read-only file system"と言っているので、read onlyなんだと思います。
(読んだ通りに書いただけで回答にも説明になってなくてすみません)

どのようにしてマウントしてますか?
マウントしたときに何かメッセージは表示されていませんか?
ファイルシステムはFATでしょうか?

マウント後に/etc/mtabを調べると何かわかるかもしれません。
外していたら、ゴメンナサイ。

--
なかむら

ご指摘の通り、ディレクトリ側に書込み権限がありませんでした。
ありがとうございました。

mjpg_streamer -i "/usr/lib/mjpg_streamer/input_uvc.so -d /dev/video1 -yuv -r 640x480 --fps 30" -o "/usr/lib/mjpg_streamer/output_file.so -f /mnt"&

上記状態で、ファイル確認しています。
vsyncに同期してLED ON/OFF画像を取り込み,fps30設定でファイル化しましたが、ヌケが生じます
※ON/OFF/ONと続くはずですが、中にはON/ON、OFF/OFFとコマ落ちでフィアイル化されています。

フレームレート自身を落とせば、ヌケ落ちを防げるのか確認したいのですが。
フレームレートはカメラパラメータには無いのですが、変更可能でしょうか
※mjpg_streamer -i "/usr/lib/mjpg_streamer/input_uvc.so -d /dev/video1 -yuv -r 640x480 --fps 1"としても、vsyncは変更なかったので

> ※mjpg_streamer -i "/usr/lib/mjpg_streamer/input_uvc.so -d /dev/video1 -yuv -r 640x480 --fps 1"としても、vsyncは変更なかったので

UVCカメラの vsync という意味ですか?

fps の設定をしても、秒間30枚の画像が作られるという意味でしょうか?

もし、--fpsが効いていないのであれば、atmark-dist/user/mjpg-streamer/mjpg-streamer.r94/plugins/input_uvc/v4l2uvc.c の、 ioctl(vd->fd, VIDIOC_S_PARM, setfps);
あたりが動いてないことになりますね。

すみません、一つ確認させてください。

a810にカメラを接続しているとおもうのですが、どんなカメラをつないでいますか?
カメラモジュール01の場合、そもそもUVCじゃないですね。

接続しているのは、a810のカメラです。
当初よりこの設定で動作していたので、疑っていなかったのですが
a810カメラですと、何を指定してみるといいでしょうか

> > ※mjpg_streamer -i "/usr/lib/mjpg_streamer/input_uvc.so -d /dev/video1 -yuv -r 640x480 --fps 1"としても、vsyncは変更なかったので
>
> UVCカメラの vsync という意味ですか?
>
> fps の設定をしても、秒間30枚の画像が作られるという意味でしょうか?

すみませんでした、質問に答えておりませんでした。
信号はご指摘の通りvsyncです。
fps設定を変えると画像枚数は変化しますが、ハード的な信号vsyncに変化がないという意味です。
上記指定したフレームレートでファイルが続けばいいのですが、どうしてもLED ON画像/LED OFF画像/LED ON画像と続かない状態です。

kensakuと申します。
明確にコレが原因というのは回答出来ませんが、下記のような切り分けをされてはどうでしょうか。

①画像サイズをVGAからQVGAに落として同様の試験を行う。
②FPSを15に落として同様の試験を行う。(こちらは既に試されている可能性もありますが)

この2つの目的はアプリの処理性能が間に合っていない可能性を考慮した確認です。
もし、上記どちらかで発生しなくなるor発生頻度が落ちるようであれば処理負荷の問題が考えられます。
あわせてTOPコマンド等でCPU状況を確認されてみてはどうでしょうか。
ちなみにmjpg-streamerでのJPEGエンコードはソフトエンコード(Armadillo上だとNEON対応版だと思いました)の為、
CPUをかなり使っている可能性があります。

③Gstreamerを使ってみる
810のカメラを使っているのであれば、mjpg-streamerではなく、Gstreamerを使われてはどうでしょうか。
こちらであればAV-CodecミドルウェアによるJPEGエンコードを行うので処理負荷が変わるかと思います。
 http://manual.atmark-techno.com/armadillo-840/armadillo-840_product_man…
こちらを参考に。
USBのカメラで同条件設定でmjpg-streamerとGStreamer両方使ってみましたが、GStreamerの方が処理速度が早いです。
細かい理屈は分かりませんが。。。

この3つを試しても改善しない場合はvsyncとの取得画像の同期が取れていない可能性を考慮した方がいいかもしれません。
発生するタイミングがある周期毎で起きてしまうのであればそういう話も考えられるのでしょうか。

以上、宜しくお願い致します。

kensakuと申します。
説明漏れがあったのでいくつか追記します。

>接続しているのは、a810のカメラです。
> 当初よりこの設定で動作していたので、疑っていなかったのですが
>a810カメラですと、何を指定してみるといいでしょうか

コマンド方法は問題ありません。mjpg-streamerのinput_uvcプラグインは名前はUVCですが、
実際はV4L2コマンドで制御しています。
よってロジクールのUVCカメラ以外でもV4L2で制御出来るカメラは全てOKです。

また、処理負荷をお話したきっかけとなる、mjpg-streamerの欠点として、カメラ制御はシングルスレッドで実行されている事があります。
一枚毎に画像取得し、JPEGエンコードが完了するまで次の画像を取りにいきません。
よって、次の画像を取りにいったタイミングでは既にフレーム遅れの画像を取得している事が考えられます。

簡単に調べたいならば、数十ミリ秒レベルで表示出来るストップウォッチ等を撮影してみてはどうでしょう(PC上のフリーソフトでもいいと思います)。
・ミリ秒刻みがずれている⇒処理負荷又はVSyncとの同期ずれ
・ミリ秒刻みがあっているのにLED順序があってない⇒そもそもLED点灯タイミングがずれている?

上記に記載されていたような画像に文字を埋め込んだり、v4l2の戻り値のtimestamp等を表示しても良いと思いますが。。。

kensaku様

コメント頂きありがとうございます。
> ①画像サイズをVGAからQVGAに落として同様の試験を行う。
> ②FPSを15に落として同様の試験を行う。(こちらは既に試されている可能性もありますが)

これに関しては、推測通りCPU側の処理が追いつかなくコマ落ちしていたようです。
fps30でも実際には25程度でした。
1fpssにしても、どうゆう理由か分かりませんが場合によっては100msもヅレます。
LEDの同期は問題ないようです。
ただし、解像度を変更してvsyncに同期したLED信号を作ると、画像との同期が取れませんでした。
mjpg_streamer以外にも調整が必要な気がいたします。

これらの結果から、推薦頂いたGStreamerを試してみたいと思います。
コーデックをまだ有効に出来ないので、仕様書を見ながら試してみます。

[armadillo /]# cat /sys/devices/platform/acm.0/codec
decoder encoder [none]