Armadilloフォーラム

gstreamer

a-mizutani

2016年2月2日 10時53分

お世話になっています、水谷です

先日はどうもありがとうございました
おかげでArmadillo上でQtプログラムからgstreamerが動作する様になりました

gstreamerでプログラムする事で、画像を直接圧縮プログラムに送れると思いきや
また壁にぶつかってしまいました

今やりたい事は
Qtプログラム上で動画(連番画像)を作成←OK
gstreamerに画像を流し込み、filesinkにてaviファイルとして保存←保存自体は出来る

と言う事です
gstreamerでは、やり方が分からなかったのでvideotestsrcを使って任意のフレームを作り出して
プローブを挿入して、ピクセルデータを置き換えています

添付のgst_use.cppのコンストラクタがその準備をしているソースです
新しいvideotestsrcにより新しいフレームが生成される度に
cb_have_dataメソッドが呼ばれます
ここで画像の差し替えを行おうとしてmap.dataの中身を書き換えてやりました
一見うまく行ったかと思ったのですが、saveImage_000019.jpgの様になってしまいました
元の絵を塗りつぶして黒塗りをしたのですが、塗りつぶした黒の上に黄色い色が残っています
青色は更に濃く残ります
どうしてこうなるのかが良く分かりませんでした
・・・

ここまでつらつらと書いておいて何ですが
根本的に、ソースを作り出す時点でテストソースを使用している事が
既に歪なのだろうとおもいます

知りたい事としては
自分で用意したイメージデータを元データとして
ソースを作り出す事は出来ないでしょうか?
プラグインを作成する事ができる事は学習したのですが
プラグインを作成してしまうと、本体とは別ソースになってしまい
本体が作り出したイメージバッファを引き渡す方法が想像できなくて
困っています

何か良い知恵があれば、教えて下さい

ファイル ファイルの説明
gst_use.cpp
saveImage_000019.jpg
コメント

at_shota.tamura

2016年2月2日 11時23分

田村です。

> 知りたい事としては
> 自分で用意したイメージデータを元データとして
> ソースを作り出す事は出来ないでしょうか?

appsrc [*1] が使えるかもしれません。

[*1]: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-ba…

> プラグインを作成する事ができる事は学習したのですが
> プラグインを作成してしまうと、本体とは別ソースになってしまい
> 本体が作り出したイメージバッファを引き渡す方法が想像できなくて
> 困っています

appsrc を使えば、ソース(Source Element)の動きを、
アプリケーションで(プラグインとして分けずに)実装できます。

使い方はこちら[*2]が参考になります。

[*2]: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/se…

参考になりましたら幸いです。

at_yashi

2016年2月2日 19時17分

> gstreamerでは、やり方が分からなかったのでvideotestsrcを使って任意のフレームを作り出して
> プローブを挿入して、ピクセルデータを置き換えています

videotestsrc で作成した書きかえ元の GstBuffer と、Qtで生成した画像のサイズやフォーマットが
あってないと変になります。

もし、連番のファイルがすでにあるなら、 multifilesrc は、どうでしょう。
http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-go…

> ここで画像の差し替えを行おうとしてmap.dataの中身を書き換えてやりました

gst_buffer_make_writable() は、「書き込み可能なバッファを作る(make)関数」なので
気をつけてくださいね。

https://developer.gnome.org/gstreamer/stable/gstreamer-GstBuffer.html#g…

> 一見うまく行ったかと思ったのですが、saveImage_000019.jpgの様になってしまいました
> 元の絵を塗りつぶして黒塗りをしたのですが、塗りつぶした黒の上に黄色い色が残っています
> 青色は更に濃く残ります
> どうしてこうなるのかが良く分かりませんでした

ちゃんと書けてないないような気がします。

- writeableにする必要ってあるんでしたっけ?
- そのまま書いたら、かけませんか?
- 受け取った buffer は unref() してしまって、必要なデータから buffer を生成しなおしたらどうですか?
- その時は、メタデーターを合わせる必要があるかも?

> 知りたい事としては
> 自分で用意したイメージデータを元データとして
> ソースを作り出す事は出来ないでしょうか?

すでに出てますが appsrc が便利です。
ceu2rtp でも appsrc を使っていますが thread を多用しているので
参考にするには複雑かもしれません。
https://github.com/atmark-techno/ceu2rtp/blob/master/ceu2rtp.c#L711

multifilesrc のソースも参考になるかと
http://cgit.freedesktop.org/gstreamer/gst-plugins-good/tree/gst/multifi…

a-mizutani

2016年2月3日 9時16分

水谷です

お二方から返信頂きました、どうもありがとうございます
保存自体は出来る様になったのですが
頂いたコメントを読むと、どうも私の理解が浅く
危険なソースになっている様です

> gst_buffer_make_writable() は、「書き込み可能なバッファを作る(make)関数」なので
> 気をつけてくださいね。
この辺りとか、全然分かっていなかったです
もうちょい勉強します

兎に角ありがとうございました

> > gstreamerでは、やり方が分からなかったのでvideotestsrcを使って任意のフレームを作り出して
> > プローブを挿入して、ピクセルデータを置き換えています
>
> videotestsrc で作成した書きかえ元の GstBuffer と、Qtで生成した画像のサイズやフォーマットが
> あってないと変になります。
>
> もし、連番のファイルがすでにあるなら、 multifilesrc は、どうでしょう。
> http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-go…
>
> > ここで画像の差し替えを行おうとしてmap.dataの中身を書き換えてやりました
>
> gst_buffer_make_writable() は、「書き込み可能なバッファを作る(make)関数」なので
> 気をつけてくださいね。
>
> https://developer.gnome.org/gstreamer/stable/gstreamer-GstBuffer.html#g…
>
> > 一見うまく行ったかと思ったのですが、saveImage_000019.jpgの様になってしまいました
> > 元の絵を塗りつぶして黒塗りをしたのですが、塗りつぶした黒の上に黄色い色が残っています
> > 青色は更に濃く残ります
> > どうしてこうなるのかが良く分かりませんでした
>
> ちゃんと書けてないないような気がします。
>
> - writeableにする必要ってあるんでしたっけ?
> - そのまま書いたら、かけませんか?
> - 受け取った buffer は unref() してしまって、必要なデータから buffer を生成しなおしたらどうですか?
> - その時は、メタデーターを合わせる必要があるかも?
>
> > 知りたい事としては
> > 自分で用意したイメージデータを元データとして
> > ソースを作り出す事は出来ないでしょうか?
>
> すでに出てますが appsrc が便利です。
> ceu2rtp でも appsrc を使っていますが thread を多用しているので
> 参考にするには複雑かもしれません。
> https://github.com/atmark-techno/ceu2rtp/blob/master/ceu2rtp.c#L711
>
>
> multifilesrc のソースも参考になるかと
> http://cgit.freedesktop.org/gstreamer/gst-plugins-good/tree/gst/multifi…