openwrt gstreamer实例学习笔记(四. gstreamer Bins)

1)概述

Bins是一种容器element。你可以往Bins中添加element。由于Bins本身也是一种element,所以你可以像普通element一样 操作Bins。因此,先前关element的内容同样可以应用于Bins。

Bins允许你将一组有链接的element组合成一个大的逻辑element。你不再需要对单个element进行操作,而仅仅操作Bins。当你在构建一个复杂的管道时,你会发现Bins的巨大优势,因为它允许你将复杂的管道分解成一些小块。

Bins同样可以对包含在其中的element进行管理。它会计算数据怎样流入Bins,并对流入的数据流制定一个最佳的计划(generate an optimal plan)。计划制定(Plan generation)是GStreamer中最复杂的步骤之一。

形象化的Bins:

 

GStreamer程序员经常会用到的一个特殊的Bins:

(Pipeline)管道:是一种允许对所包含的element进行安排(scheduling)的普通容器。顶层(toplevel)Bins必须为一个管道。因此每个GStreamer应用程序都至少需要一个管道。当应用程序启动后,管道会自动运行在后台线程中。

 

 

2)创建Bins

你可以通过使用创建其他element的方法来创建一个Bins,如使用GstElementFactory等。当然也有一些更便利的函数来创建Bins— (gst_bin_new()和 gst_pipeline_new ())。你可以使用gst_bin_add()往Bins中增加element,使用gst_bin_remove()移除Bins中的element。当你往Bins中增加一个element后,Bins会对该元件产生一个所属关系;当你销毁一个Bins后,Bins中的element同样被销毁 (dereferenced);当你将一个element从Bins移除后,该element会被自动销毁(dereferenced)。

#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_pipeline_new ("my_bin");

  source = gst_element_factory_make ("fakesrc", "source");

  sink = gst_element_factory_make ("fakesink", "sink");

  /* set up pipeline */

  gst_bin_add_many (GST_BIN (bin), source, sink, NULL);

  gst_bin_add (GST_BIN (pipeline), bin);

  gst_element_link (source, sink);

[..]

}

 

3)定义bins

程序员可以自定义能执行特定任务的Bins。例如,你可以参照下面的代码写一个 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);

[..]

}

自定义的Bins可以同插件或XML解释器一起被创建。你可从 Plugin Writers Guide得到更多关于创建自定义Bins的信息。gst-plugins-base中的playbin与decodebin元件都是自定义箱柜的例子。

 

时间: 2024-11-10 17:51:20

openwrt gstreamer实例学习笔记(四. gstreamer Bins)的相关文章

openwrt gstreamer实例学习笔记(一.初始化gstreamer)

GStreamer 是一个非常强大而且通用的流媒体应用程序框架. GStreamer所具备的很多优点来源于其框架的模块化: GStreamer能够无缝的合并新的插件. 但是, 由于追求模块化和高效率, 使得GStreamer在整个框架上变的复杂, 也同时因为复杂度的提高, 使得开发一个新的应用程序显得不是那么的简单. 由于工作需求,因此笔者开启了gstreamer构建音频播放器之路! 首先openwrt下面make menuconfig 要选择gstreamer必要的插件库,由于openwrt下

openwrt gstreamer实例学习笔记(三.深入了解gstreamer 的 Element)

在前面的部分,我们简要介绍过 GstElementFactory 可以用来创建一个element的实例,但是GstElementFactory不仅仅只能做这件事,GstElementFactory作为在 GStreamer 注册系统中的一个基本类型,它可以描述所有的插件(plugins)以及由GStreamer创建的element.这意味着GstElementFactory可以应用于一些自动element实例, 像自动插件(autopluggers); 或者创建一个可用element列表,像管道

openwrt gstreamer实例学习笔记(六. gstreamer Pads及其功能)

一:概述 如我们在Elements一章中看到的那样,Pads是element对外的接口.数据流从一个element的source pad到另一个element的sink pad.pads的功能(capabilities)决定了一个element所能处理的媒体类型. 一个pad的类型由2个特性决定:它的数据导向(direction)以及它的时效性(availability).正如我们先前提到 的,Gstreamer定义了2种pads的数据导向:source pad以及sink pad.pads的数

openwrt gstreamer实例学习笔记(七. gstreamer 缓冲区(Buffers)和事件(Events))

1)概述 管道的数据流由一组缓冲区和事件组成,缓冲区包括实际的管道数据,事件包括控制信息,如寻找信息和流的终止信号.所有这些数据流在运行的时候自动的流过管道. 2) 缓冲区(Buffers) 缓冲区包含了你创建的管道里的数据流.通常一个source element会创建一个新的缓冲区,同时element还将会把缓冲区的数据传递给下一个element.当使用GStreamer底层构造来创建一个媒体管道的时候,你不需要自己来处理缓冲区,element将会为你处理这些缓冲区. 一个缓冲区主要由以下一个

openwrt gstreamer实例学习笔记(二.gstreamer 的 Element)

对程序员来说,GStreamer 中最重要的一个概念就是 GstElement 对象.该对象是构建一个媒体管道的基本块.所有上层(high-level)部件都源自GstElement对象.任何一个解码器编码器.分离器.视频/音频输出部件实际上都是一个 GstElement对象. 对程序员来说,element就像一个黑盒子.你element的一端输入数据,element对数据进行一些处理,然后数据从element的另一端输出.拿一个解码element来说,你输入一 些有特定编码的数据,elemen

openwrt gstreamer实例学习笔记(五. gstreamer BUS)

1)概述 BUS(总线) 是一个简单的系统,它采用自己的线程机制将一个管道线程的消息分发到一个应用程序当中.总线的优势是:当使用GStreamer的时候,应用程序不需要线程识别,即便GStreamer已经被加载了多个线程. 每一个管道默认包含一个总线,所以应用程序不需要再创建总线.应用程序只需要在总线上设置一个类似于对象的信号处理器的消息处理器.当主循环运行的时候,总线将会轮询这个消息处理器是否有新的消息,当消息被采集到后,总线将呼叫相应的回调函数来完成任务. 2)如何使用一个总线(Bus) 使

[Openwrt 项目开发笔记]:Samba服务&amp;vsFTP服务(四)

在上一节中,我们讲述了如何在路由器上挂载U盘,以及如何通过改造U盘提升路由器的存储和数据处理能力.通过增加USB挂载,为我们后续进行智能家居构建提供了保障. 在本节中,我将简单介绍如何在路由器上建立网络文件共享服务. 一.为何要建立文件共享服务: 在智能家居网络中,一个很重要的需求就是安全.当一个智能家居方案部署之后,用户往往最先考虑的也是安全问题.那么怎样进行安全管理呢?一种常用的解决方法是实时的监控传感器以及家电的状态,一旦发生异常,通过邮件.短信甚至打电话的方式通知用户.当用户接收到异常之

cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&amp;主角添加动作

这一步当中,我们主要完成以下功能: 1.地图的无限滚动---让主角看起来真的是在跑动 2.给主角添加Jump跳跃和crouch下蹲动作 那么首先来让背景滚动起来,在PlayScene.h中添加: //初始化背景 void initBG(); //用update函数让地图滚动 virtual void update(float dt); //背景精灵 cocos2d::Sprite* bgSprite1; cocos2d::Sprite* bgSprite2; cocos2d::Sprite* g

[Openwrt 项目开发笔记]:Openwrt必要设置(二)

前面的两篇blog中,我将如何搭建Openwrt的开发.编译.调试以及烧写环境的方法一一列出了.从本文开始, 我将介绍如何一步一步进行Openwrt设置,以满足路由器作为智能家居网关的功能. ok,闲话休提,开始上干货. 一.Openwrt初始配置 1. 密码设置 当我们成功地将Openwrt刷入路由器后,路由器会经过大约4~5分钟的时间重启(以Netgear Wndr3700为例).待路由器启动之后,用一根网线与路由器LAN口直连,并将PC的IP设置到192.168.1.*网段. 提示:不同的