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_yashi
> 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
水谷です
お二方から返信頂きました、どうもありがとうございます
保存自体は出来る様になったのですが
頂いたコメントを読むと、どうも私の理解が浅く
危険なソースになっている様です
> 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…
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…
参考になりましたら幸いです。