Bins
bin 是一个容器型的 element。 您可以将element添加到 bin。 由于 bin 本身就是一个element,因此可以以与任何其他element相同的方式处理 bin。 因此,整个前一章的内容(element)也适用于 bin。
什么是bins
Bins允许您将一组已链接element组合成一个逻辑element。 您不再处理单个element,而只处理一个element,即 bin。 我们将看到,当您要构建复杂的pipeline时,这非常强大,因为它允许您将pipeline分解为更小的块。
bin 还将管理其中包含的element。 它将对element执行状态更改以及收集和转发总线消息。
GStreamer 程序员可以使用一种特殊类型的 bin:
- pipeline :管理所包含element的同步和总线消息的通用容器。 顶层 bin 必须是一个pipeline,因此每个应用程序都至少需要其中一个。
创建bin
bin 的创建方式与创建其他elements 的方式相同,即使用element工厂。 还有一些方便的函数可用(gst_bin_new () 和 gst_pipeline_new ())。 要将elements 添加到 bin 或从 bin 中删除elements ,可以使用 gst_bin_add() 和 gst_bin_remove()。 请注意,您添加element 的 bin 将获得该element 的所有权。 如果销毁 bin,element将被取消引用。 如果从 bin 中删除一个element,它将自动取消引用。
#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 中查找element。 最常用的是gst_bin_get_by_name()和gst_bin_get_by_interface()。 您还可以使用函数 gst_bin_iterate_elements () 迭代 bin 包含的所有element。 有关详细信息,请参阅 GstBin 的 API 参考。
自定义bins
程序开发者可以创建包含element的自定义 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 element。)
可以使用插件或从应用程序创建自定义bin。您将在插件编写者指南中找到有关创建自定义 bin 的更多信息
此类自定义 bin 的示例是 gst-plugins-base 中的 playbin 和 uridecodebin 元素。
bin管理他们子element的状态
Bins 管理其中包含的所有element的状态。如果您使用 gst_element_set_state() 将 bin(或pipeline,这是一种特殊的顶级 bin 类型)设置为某个目标状态,它将确保其中包含的所有element也将设置为该状态。这意味着通常只需要设置顶级pipeline的状态来启动或关闭pipeline。
bin 将对其从 sink element到 source element的所有子element 执行状态更改。这确保了当上游element进入暂停或播放状态时,下游element已经准备好接收数据。类似地,在关闭时,sink element将首先设置为 READY 或 NULL,这将导致上游element收到 FLUSHING 错误并在element设置为 READY 或 NULL 状态之前停止流线程。
但是请注意,如果将element添加到已经在运行的 bin 或 pipeline中,例如在“pad- added”信号回调中,它的状态不会自动与它被添加到的 bin 或pipeline的当前状态或目标状态一致。相反,在向已经运行的pipeline中添加element时,您需要自己使用 gst_element_set_state () 或 gst_element_sync_state_with_parent () 将其设置为所需的目标状态。