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=
となっているものを見かけます。 tee
や demux
を使うときに使われることが多いようです。実はこれが、 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
の元になっている GstObject
に name
というプロパティがあるので、 GstElement
から派生しているオジェクトであれば、みんな名前が取れます。 pipeline
でも。お試しあれ。
No comments:
Post a Comment