Gstreamer - 箱柜(Bins)

Bins

bin 是一个容器型的 element。 您可以将element添加到 bin。 由于 bin 本身就是一个element,因此可以以与任何其他element相同的方式处理 bin。 因此,整个前一章的内容(element)也适用于 bin。

什么是bins

Bins允许您将一组已链接element组合成一个逻辑element。 您不再处理单个element,而只处理一个element,即 bin。 我们将看到,当您要构建复杂的pipeline时,这非常强大,因为它允许您将pipeline分解为更小的块。

bin 还将管理其中包含的element。 它将对element执行状态更改以及收集和转发总线消息。

Visualisation of a bin with some elements in it

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 () 将其设置为所需的目标状态。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值