Armadilloフォーラム

AVコーデックミドルウェア使用しての表示、録画方法

kazu_2012

2014年6月10日 17時01分

別スレッドを立ててお聞きします。

①Armadillo810+810wlan製品に対して、AVコーデックでArmadillo810内SDカード録画。
同時にカメラ画像を無線でストリーミングさせPCで表示する場合、どのような表示コマンドが使えますでしょうか。
これまでmjpeg_stremaerで動いていた動作は、共存できるでしょうか。
※ほかの表示コマンドがあるのであれば、教えてください。

②AVコーデックを導入しましたが、マニュアル通り10フレームをjpegしたところ、以下のようなエラーが帰ってきました。
  まだ810wlanを使用するにあたっての設定があれば教えてください。

[root@armadillo810-0 (pts/0) ~]# gst-launch-1.0 -e v4l2src device=/dev/video1 nu
m-buffers=10 ! video/x-raw,width=640,height=480,framerate=30/1 ! videoconvert !
acmjpegenc ! multifilesink location=/mnt/output%d.jpeg
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
WARNING: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Could not get parameters on device '/dev/video1'
Additional debug info:
gstv4l2object.c(2445): gst_v4l2_object_set_format (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
system error: Inappropriate ioctl for device
Got EOS from element "pipeline0".
Execution ended after 1123336751 ns.
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
[root@armadillo810-0 (pts/0) ~]#
コメント

kensaku

2014年6月12日 17時24分

kensakuと申します。
出来る範囲でアドバイス致します。

> ①Armadillo810+810wlan製品に対して、AVコーデックでArmadillo810内SDカード録画。
> 同時にカメラ画像を無線でストリーミングさせPCで表示する場合、どのような表示コマンドが使えますでしょうか。
> これまでmjpeg_stremaerで動いていた動作は、共存できるでしょうか。

可能です。これは丁度アットマークさんと相談しながら対応しました。
mjpeg_stremaerのinput_file.soを使用します。

【Gstreamer】
gst-launch-1.0 -e v4l2src device=/dev/video1 num-buffers=10 \
! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 \
! acmjpegenc ! multifilesink location=/mnt/output%d.jpeg

【mjpg-streamer】
/mjpg_streamer -i "./input_file.so -f /mnt/" -o "./output_http.so -w ./www -p 8081"

でOKです。
但し、input_fileをそのまま使用すると作成中のファイルまで読みにいってしまう為、ソースコードの修正が必要になります。
input_file.cで使用しているinotify_add_watchの指定からIN_CLOSE_WRITEのマスクを外して下さい。
 ※これでGstreamerの生成中のファイルを監視対象から外す事が出来ます。

他にも配信系のアプリはいくつかありますが、試していないので回答は割愛します、すみません。

> ②AVコーデックを導入しましたが、マニュアル通り10フレームをjpegしたところ、以下のようなエラーが帰ってきました。
>   まだ810wlanを使用するにあたっての設定があれば教えてください。

>Could not get parameters on device '/dev/video1'

> system error: Inappropriate ioctl for device
がある為、カメラに接続出来ていない又はV4L2コマンドが通っていないと思われます。
mjpg-streamerを使われていた場合もvideo1を指定していたんですよね?
もし同じ環境でmjpg-streamerからvideo1でカメラ制御が通るのであれば私からはちょっと原因特定が難しいです。
※810も無ければ810付属のカメラも手元にないので確認が出来ませんので・・・
お力になれず申し訳ないです。

以上

kensaku

2014年6月13日 8時53分

kensakuと申します。
一晩立って書き込みを見直してみました。

>[root@armadillo810-0 (pts/0) ~]# gst-launch-1.0 -e v4l2src device=/dev/video1 nu
>m-buffers=10 ! video/x-raw,width=640,height=480,framerate=30/1 ! videoconvert !
>acmjpegenc ! multifilesink location=/mnt/output%d.jpeg

上記コマンドはフォーマット指定が抜けています。
私の前の書き込みにコマンド例がありますのでそちらでもう一度お試しを。
但し、フォーマット指定せずとも勝手に判断して動くものはあります。

>gstv4l2object.c(2445): gst_v4l2_object_set_format (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
>system error: Inappropriate ioctl for device

フォーマット指定ぽいコマンドでエラーが出ているので当たりだと良いのですが。

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

kazu_2012

2014年7月4日 11時42分

kensaku様

時間が空いてしまい申し訳ございません。
再度確認ですが、
>> ①Armadillo810+810wlan製品に対して、AVコーデックでArmadillo810内SDカード録画。
>> 同時にカメラ画像を無線でストリーミングさせPCで表示する場合、どのような表示コマンドが使えますでしょうか。
>> これまでmjpeg_stremaerで動いていた動作は、共存できるでしょうか。

>可能です。これは丁度アットマークさんと相談しながら対応しました。
>mjpeg_stremaerのinput_file.soを使用します。

>【Gstreamer】
>gst-launch-1.0 -e v4l2src device=/dev/video1 num-buffers=10 \
> ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 \
> ! acmjpegenc ! multifilesink location=/mnt/output%d.jpeg

>【mjpg-streamer】
>/mjpg_streamer -i "./input_file.so -f /mnt/" -o "./output_http.so -w ./www -p 8081"

質問1
上記ですと、Gstreamerで録画⇒録画ファイルをmjpg-streamerで表示ということでしょうか?
上記が正しいとすると、私の希望としては
mjpg-streamerで表示⇒任意のタイミングでGstreamer録画としたいのですが、この構成は可能でしょうか?
※アットマークテクノ様にも同様に質問したいのですが

質問2
以下、提案いただいたコマンドで動作させてみました。
まず、カメラフォーマットを指定してみましたがエラーやワーニングがでます。
ワーニングに関しては、現状の公開ソースですと表示されるのが”正常”でしょうか?
あるいは、追加情報が必要なのでしょうか

質問3
質問2に起因しているのかもしれませんが、エラーに関する原因は何が考えられるのでしょうか
・ERROR: from element /GstPipeline:pipeline0/GstMultiFileSink:multifilesink0: No space left on the resource.⇒メモリー数不足でしょうか?
・from element /GstPipeline:pipeline0/GstAcmJpegEnc:acmjpegenc0: Could not encode stream.⇒???
・ from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data flow error.
ファイル保存数1000を指定していますが、出来上がったのは300ファイル前後でした。

御手数ですが、コメント頂けると幸いです。

ファイル ファイルの説明
disp4.txt

kensaku

2014年7月4日 17時14分

kensakuと申します。
また今回も分かる範囲だけですみませんが。

>質問1
こちらは他の有識者の方の意見を聞かれた方が良いかと思います。

私が提案した案(GstreamerでJPG生成しmjpg-streamerでMJPG配信)は正直無駄な要素が多いです。
このやり方は、jpegファイルを常にローカルで保存しつつ、たまにカメラ映像が見たい時に
jpegファイルをMJPEG形式でストリーミングで流してくれる手法になります。
さらにユーザ操作やトリガタイミングでその直前直後のjpegファイルをFTPで配信したりという事も
プログラムを作れば可能になると思います。
ぶっちゃけていうと某メーカーが実装しているIPカメラの処理を模倣したものと言えます。

Gstreamer自身にもストリーミング配信する機能がありますので、Gstreamer単独で貴殿の希望が
実現出来るか調査されてはどうでしょうか。
(保存しつつ配信が出来るかについては試したことがないので分かりません)

>質問2
>質問3
エラーは出ますが JPEGファイルが保存されている事を見ると画像は取得出来ているようですね。
エラーの原因については前回お話したとおり、カメラが無いためわかりません、すみません。。。
リソース不足は/mnt/配下のメモリ不足の可能性が高いです。
dfコマンドで容量を確認してみて下さい。
mjpg-streamerのオプションで配信したjpegファイルを削除するようにするか、
別途プログラムやシェル、スケジューラ等で定期的に削除する実装が必要になります。

ちなみに、mjpg-streamerとGsreamerは同時に実行する必要があります。
mjpg-streamerは起動後から/mnt/ファイルにおかれたファイルをストリーミング配信します。
既におかれているファイルに対しては何もしません。
よって起動順番としてはmjpg-streamerが先が良いです。
コマンド実行時に&つけてバックグラウンド動作させるでもいいですし、
コンソールを2個立ち上げてそれぞれで実行するのでも良いと思います。