1,Bins
Bins是容器元素,可以将元素添加到Bin中。由于Bin本身也是一个元素,因此可以像处理其他元素一样处理Bin。因此,整个之前的章节(元素)也适用于Bins。
1.1,什么是Bins
Bins允许您将一组链接的元素组合成一个逻辑元素。您不再处理单个元素,而是只处理一个元素,即Bin。当您构建复杂的管道时,会发现这非常强大,因为它允许您将管道拆分成更小的块。
Bin还将管理其中包含的元素。它将对元素执行状态更改以及收集和转发总线消息。
GStreamer程序员可以使用一种特殊类型的bin:
- 管道:管道是一个通用的容器,用于管理包含的元素的同步和总线消息。顶层bin必须是管道,因此每个应用程序至少需要一个这样的管道。
1.2,创建bin
bin的创建方式与其他元素的创建方式相同,即使用元素工厂。还有一些方便的函数可用(gst_bin_new()和gst_pipeline_new())。要将元素添加到bin或从bin中删除元素,可以使用gst_bin_add()和gst_bin_remove()。请注意,将元素添加到哪个bin中,该bin将拥有该元素。如果销毁bin,元素将随之被取消引用。如果从bin中删除元素,它将自动取消引用。
#include <gst/gst.h>
int
main (int argc,
char *argv[])
{
GstElement *bin, *pipeline, *source, *sink;
/* init */
gst_init (&argc, &argv);
/* create */
pipeline = gst_pipeline_new ("my_pipeline");
bin = gst_bin_new ("my_bin");
source = gst_element_factory_make ("fakesrc", "source");
sink = gst_element_factory_make ("fakesink", "sink");
/* First add the elements to the bin */
gst_bin_add_many (GST_BIN (bin), source, sink, NULL);
/* add the bin to the pipeline */
gst_bin_add (GST_BIN (pipeline), bin);
/* link the elements */
gst_element_link (source, sink);
[..]
}
在bin中查找元素有多种函数。最常用的是gst_bin_get_by_name()和gst_bin_get_by_interface()。您还可以使用gst_bin_iterate_elements()函数遍历bin包含的所有元素。有关详细信息,请参阅GstBin的API参考。
1.3,自定义Bins
应用程序程序员可以创建包含执行特定任务的元素的自定义bin。例如,这使得您可以仅用以下几行代码编写一个Ogg/Vorbis解码器:
int
main (int argc,
char *argv[])
{
GstElement *player;
/* init */
gst_init (&argc, &argv);
/* create player */
player = gst_element_factory_make ("oggvorbisplayer", "player");
/* set the source audio file */
g_object_set (player, "location", "helloworld.ogg", NULL);
/* start playback */
gst_element_set_state (GST_ELEMENT (player), GST_STATE_PLAYING);
[..]
}
(当然,这是一个愚蠢的例子,已经存在一个更强大、更通用的自定义bin:playbin元素。)
可以在插件中或从应用程序中创建自定义bin。关于创建自定义bin的更多信息,请参阅插件编写者指南。
这种自定义bin的示例包括gst-plugins-base中的playbin和uridecodebin元素。
1.4,Bins管理其子元素的状态
Bins管理其中包含的所有元素的状态。如果您使用gst_element_set_state()将bin(或管道,这是一种特殊的顶级类型的bin)设置为某个目标状态,它将确保其中包含的所有元素也被设置为该状态。这意味着通常只需设置顶级管道的状态即可启动管道或关闭管道。
Bin将从接收元素到源元素对其所有子元素执行状态更改。这确保了当下行元素准备就绪时,上行元素被带到暂停或播放状态。同样,在关闭时,首先将接收元素设置为就绪或空状态,这将导致上行元素收到FLUSHING错误并停止流线程,然后元素被设置为就绪或空状态。
然而,请注意,如果将元素添加到已经运行的bin或管道中,例如在“pad-added”信号回调中,其状态不会自动与添加它的bin或管道的当前状态或目标状态一致。相反,当向已运行的管道添加元素时,您需要使用gst_element_set_state()或gst_element_sync_state_with_parent()自己将其设置为所需的目标状态。