Armadilloフォーラム

WiFi経由したストリーミングデータの保存について

u_suda

2018年11月28日 10時51分

お世話になります。
gstreamerを使用しています。
Armadillo-840m 1台にカメラとLCDを接続したときは、ストリーミングデータの表示と保存が出来ました。

Armadillo-840m 2台をWiFi接続してストリーミングデータの受け渡しを行いたいと考えています。
表示ができることは確認しましたが、保存ができません。
WiFi経由したときのストリーミングデータの保存方法を教えてください。
そもそもWiFi経由したときに表示と保存の両立が可能でしょうか。
ご存知の方いましたらご教授願います。

送信側:
Armadillo-840m
Armadillo-810 カメラモジュールセット01(B コネクタ用)
Armadillo-WLAN(AWL13)

受信側:
Armadillo-840m
Armadillo-840 拡張ボード 01(C コネクタ用)
Armadillo-WLAN(AWL13)

共通環境:
カーネル :linux-3.4-at26
atmark-dist:atmark-dist-20180330

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

コメント

at_kojiro.yamada

2018年12月3日 14時02分

> Armadillo-840m 2台をWiFi接続してストリーミングデータの受け渡しを行いたいと考えています。
> 表示ができることは確認しましたが、保存ができません。

差し支えなければ、送信側と受信側でどんなパイプラインを作っているのか教えていただけますか?

rtspsrc ! h264parse ! acmh264dec ! acmfbdevsink
のようなパイプラインを作っていると思うのですが、
acmh264dec以降を filesinkで置き換えて

rtspsrc ! h264parse ! h264parse ! filesink

としたら、ファイルに保存できないでしょうか?

ご指摘ありがとうございます。

> 差し支えなければ、送信側と受信側でどんなパイプラインを作っているのか教えていただけますか?
初歩的なことを忘れており申し訳ございません。
現在、使用しているパイプラインおよび受信側のエラーログを添付します。

送信側パイプライン:
Sender.sh

受信側パイプラインおよびエラーログ:
errorlog1.txt

> rtspsrc ! h264parse ! acmh264dec ! acmfbdevsink
> のようなパイプラインを作っていると思うのですが、
> acmh264dec以降を filesinkで置き換えて
>
> rtspsrc ! h264parse ! h264parse ! filesink
> としたら、ファイルに保存できないでしょうか?

また、受信側のパイプラインをご指摘の通りに変更しましたが、未だ保存することができませんでした。
変更後のパイプラインとエラーログは下記の様に添付します。
errorlog2.txt

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

ファイル ファイルの説明
Sender.sh 送信側パイプライン
errorlog1.txt 受信側パイプラインおよびエラーログ
errorlog2.txt 変更後の受信側パイプラインおよびエラーログ

at_kojiro.yamada

2018年12月4日 10時40分

> 受信側パイプラインおよびエラーログ:
> errorlog1.txt

こちらのログに

ERROR: from element /GstPipeline:pipeline0/GstFileSink:filesink0: No space left on the resource.

というエラーが出ていますが、
root/以下はストリーミングデータに対して十分な容量を持っていないのではないでしょうか?

> root/以下はストリーミングデータに対して十分な容量を持っていないのではないでしょうか?
仰る通りでした。
保存先をUSBメモリにし、rtpbin以下を下記にしたところ、"Ctrl+c"を押すまで正常に動作し、60MB程の保存ファイルが作成されました。

rtpbin. ! queue max-size-buffers=20000 ! rtph264depay ! h264parse ! h264parse ! queue max-size-buffers=20000 ! filesink location=/mnt/test.mp4

しかし、保存ファイルをArmadillo上で再生しようとした際に下記のようなエラーが出現しました。
また、保存ファイルはPC上でも再生できず、コーデック情報も全く表示されませんでした。

保存する拡張子名が間違っているのか、それともパイプラインに必要な要素が抜けてしまっているのかご教授願います。

gst-launch-1.0 filesrc location=/mnt/test.mp4 ! qtdemux name=demux0 \ demux0.video_0 ! queue ! acmh264dec stride=800 ! acmfbdevsink device=/dev/fb0
 
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
ERROR: from element /GstPipeline:pipeline0/GstQTDemux:demux0: This file is invalid and cannot be played.
Additional debug info:
qtdemux.c(597): gst_qtdemux_pull_atom (): /GstPipeline:pipeline0/GstQTDemux:demux0:
atom has bogus size 151933980
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...

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

at_kojiro.yamada

2018年12月6日 19時23分

> > root/以下はストリーミングデータに対して十分な容量を持っていないのではないでしょうか?
> 仰る通りでした。
> 保存先をUSBメモリにし、rtpbin以下を下記にしたところ、"Ctrl+c"を押すまで正常に動作し、60MB程の保存ファイルが作成されました。
>
>

> rtpbin. ! queue max-size-buffers=20000 ! rtph264depay ! h264parse ! h264parse ! queue max-size-buffers=20000 ! filesink location=/mnt/test.mp4
> 

h264parseが2つありますが、フォーラムに投稿する際に打ち間違えたのでしょうか?

送信側で Ctrl+C を押下するとどうなるでしょうか?

>
> しかし、保存ファイルをArmadillo上で再生しようとした際に下記のようなエラーが出現しました。
> また、保存ファイルはPC上でも再生できず、コーデック情報も全く表示されませんでした。
>
> 保存する拡張子名が間違っているのか、それともパイプラインに必要な要素が抜けてしまっているのかご教授願います。
>
>
>

> gst-launch-1.0 filesrc location=/mnt/test.mp4 ! qtdemux name=demux0 \ demux0.video_0 ! queue ! acmh264dec stride=800 ! acmfbdevsink device=/dev/fb0
> 
> Setting pipeline to PAUSED ...
> Pipeline is PREROLLING ...
> ERROR: from element /GstPipeline:pipeline0/GstQTDemux:demux0: This file is invalid and cannot be played.
> Additional debug info:
> qtdemux.c(597): gst_qtdemux_pull_atom (): /GstPipeline:pipeline0/GstQTDemux:demux0:
> atom has bogus size 151933980
> ERROR: pipeline doesn't want to preroll.
> Setting pipeline to NULL ...
> Freeing pipeline ...
> 

>
>
> 以上、よろしくお願い致します。

ご回答ありがとうございます。

> >

> > rtpbin. ! queue max-size-buffers=20000 ! rtph264depay ! h264parse ! h264parse ! queue max-size-buffers=20000 ! filesink location=/mnt/test.mp4
> > 

>
> h264parseが2つありますが、フォーラムに投稿する際に打ち間違えたのでしょうか?

以前回答して頂いた際にh264parseを2つ記載されていましたので2つ記載しました。
また、h26parseを1つにした際の結果は2つつけていた際の結果と変化はなく、作成した保存ファイルは再生できませんでした。

>
> 送信側で Ctrl+C を押下するとどうなるでしょうか?
送信側で Ctrl+C を押下した際には送信側のGstreamerのプラグインは終了しましたが、受信側のプラグインは起動したままでした。
そのため、受信側でも Ctrl+C を押してプラグインを終了させて保存ファイルを作成しました。
また、保存ファイルの内容としては変化はなく、ファイルサイズが十分あるのに再生することができませんでした。

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

gst-launch-1.0 filesrc location=/mnt/test.mp4 ! qtdemux name=demux0 (略)

qtdemuxは入力されるバッファがquicktime形式であることを期待しますが、
保存するときに、生のh.264をそのままfilesinkに書き出しているので、
データの形式が一致していません。

保存する時のパイプラインのfilesinkの前にqtmuxを追加してください。

(略) queue max-size-buffers=20000 ! !filesink location=/mnt/test.mp4

参照)Armadillo-840製品マニュアル 15.7.1. コンテナの扱い
https://manual.atmark-techno.com/armadillo-840/armadillo-840_product_ma…

すみません、変更後の例を書き損ねました。

> 保存する時のパイプラインのfilesinkの前にqtmuxを追加してください。
>

> (略) queue max-size-buffers=20000 ! !filesink location=/mnt/test.mp4
> 

こうです。

(略) queue max-size-buffers=20000 ! qtmux !filesink location=/mnt/test.mp4

ご指摘ありがとうございます。

qtmuxを加えた下記コードを試してみたところ、無事にMP4ファイル形式で保存および再生することが出来ました。

> (略) queue max-size-buffers=20000 ! qtmux !filesink location=/mnt/test.mp4

qtmuxが抜けていると生のh.264データが保存されるという初歩的なことに気が付いておらず、お恥ずかしい限りです。

お二方ともお忙しい中、ご対応していただき誠にありがとうございました。