Tuesday, December 8, 2015

GStreamer でプログラミング 3 (Element と Property)

GStreamer の pipeline には複数のエレメントが含まれているようですが、どうやってエレメントを取り出すんでしょうか? 自分でエレメントを作成し、pineline に追加した時は良いのですが、 gst_parse_launch() を使った場合は?

答は、 gst_bin_get_by_name() を使います。でも取り出したいエレメントの名前が分らない? 各エレメントのインスタンス名は、デフォルトで「"エレメント名" + "インデックス番号"」となるので簡単です。インデックスは、0 始まりなので filesrc を取り出すときは、 "filesrc0" を指定してあげれば良いです。パイプライン中で、同じエレメントの複数のインスタンスがある場合、順次番号が増えていきます。また、 queue2 のようにエレメント名が数字で終っている場合は、「"エレメント名" + "-" + "インデックス番号"」と間にハイフンが入ります。

前回のコードの filesrc を取り出すなら、こんな感じです。

gst-launch-1.0 -q \
videotestsrc ! tee name=t \
t. ! queue ! ximagesink \
t. ! queue ! ximagesink \
t. ! queue ! ximagesink \
t. ! queue ! ximagesink

よく、こんな風に name= となっているものを見かけます。 teedemux を使うときに使われることが多いようです。実はこれが、 gst-launch で名前を付ける方法です。 gst-launch の時も、名前を指定しなければ tee0 と指定できます。

gst-launch-1.0 -q \
videotestsrc ! tee \
tee0. ! queue ! ximagesink \
tee0. ! queue ! ximagesink \
tee0. ! queue ! ximagesink \
tee0. ! queue ! ximagesink

なので、この2つのコマンドは同じように動きます。ただし、同じエレメントを複数使った場合は紛らわしかったり、実装が変って違う名前が付くと動かなくなるので、明示的に指定しています。

さて、C に戻ります。

gst-launch-1.0 filesrc name=mysrc location=a.txt ! fdsink

これをそのまま gst_parse_launch() に渡し

pipeline = gst_parse_launch("filesrc name=mysrc location=a.txt ! fdsink", &error);

とすると、

src = gst_bin_get_by_name(GST_BIN(pipeline), "mysrc");

として取れるんですね。取れた filesrc エレメントの名前は、もちろん "mysrc" です。 gst_element_get_name() で確認できます。 GstElement の元になっている GstObjectname というプロパティがあるので、 GstElement から派生しているオジェクトであれば、みんな名前が取れます。 pipeline でも。お試しあれ。

No comments:

Post a Comment