GStreamer应用程序——Bins

1,Bins

Bins是容器元素,可以将元素添加到Bin中。由于Bin本身也是一个元素,因此可以像处理其他元素一样处理Bin。因此,整个之前的章节(元素)也适用于Bins。

1.1,什么是Bins

Bins允许您将一组链接的元素组合成一个逻辑元素。您不再处理单个元素,而是只处理一个元素,即Bin。当您构建复杂的管道时,会发现这非常强大,因为它允许您将管道拆分成更小的块。

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

Visualisation of a bin with some elements in it

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

gstreamer应用程序开发中,要调用插件接口,可以按照以下步骤进行: 1. 创建GStreamer的pipeline:创建一个GstPipeline对象,作为音视频流的处理管道。 2. 加载插件:使用gst_element_factory_make()函数来加载所需的插件。该函数接受插件的类型和插件名称作为参数,并返回一个对应的GstElement对象。 3. 连接元素:使用gst_element_link()函数将不同的GstElement对象连接起来,形成数据流的处理链。通过将源元素和目标元素传递给该函数,可以将它们连接起来。 4. 配置插件属性:对需要的插件进行属性设置。可以使用gst_element_set_property()函数为插件设置属性值,也可以使用gst_element_get_property()函数获取属性的当前值。 5. 监听事件:为需要监听特定事件的插件添加相应的事件处理器。可以通过使用gst_element_add_event_probe()函数来添加事件探针,该函数将在触发特定事件时调用相应的回调函数。 6. 启动流媒体流:使用gst_element_set_state()函数将pipeline设置为播放状态,开始处理音视频数据流。 7. 处理数据:处理从插件接收到的数据。可以通过连接插件的src pad和sink pad来获取输入和输出数据,并在处理数据时使用对应的回调函数。 8. 监听信号:为需要监听信号的插件添加相应的信号处理函数。使用g_signal_connect()函数将信号与回调函数连接起来,在触发信号时执行相应的操作。 9. 控制流媒体流:使用gst_element_set_state()函数将pipeline设置为停止状态,结束数据的处理。 总之,调用插件接口的关键是正确配置和连接GstElement对象,以及使用适当的函数设置和获取属性值、添加事件探针和信号处理函数。以上步骤可以帮助开发者在gstreamer应用程序中调用插件接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值