前言

  前面是自动构建管道。本篇实例化每个元素并将它们链接在一起来手动构建一个管道。
  本篇创建管道分为:创建组件,连接组件,获取总线,阻塞提取需要的消息并处理。

 

Demo

  

 

管道图

  

  我们创建了两个元素:videotestsrc和autovideosink。不创建过滤元件。因此,管道看起来如下:
  

 

连接源组件和接收组件程序

步骤一:初始化gst

  

步骤二:创建组件

  

  使用gst_element_factory_make()创建新组件。第一个参数是要创建的元素类型(默认就有一些常见类型,可通过gstreamer工具获取所有可用类型的列表)。第二个参数是给这个特定实例起的名字。如果没有保留指针,为元素命名对于以后检索它们很有用(并且可以获得更有意义的调试输出)。但是,如果为名称传递NULL,GStreamer将为您提供一个唯一的名称。
  代码创建了两个元素:videotestsrc和autovideosink。不创建过滤元件。因此,管道看起来如下:
  

  • videotestsrc是一个源组件(它生成数据),用于创建测试视频模式。此元素可用于调试目的,通常在实际应用程序中找不到。
  • autovideosink是一个接收组件(它消耗数据),它在窗口上显示它接收到的图像。根据操作系统的不同,存在几种具有不同功能的视频接收器。autovideosink会自动选择并实例化最佳的一个,因此不必担心细节,并且代码更加独立于平台。

步骤三:创建空管道

  

  GStreamer中的所有元素通常必须包含在管道中才能使用,因为它负责一些时钟和消息传递功能。我们使用gst_pipeline_new()创建管道。

步骤四:管道连接组件,此处连接:源组件、接收组件

  

步骤五:修改源组件属性

  

步骤六:设置组件状态PALYING,开始播放

  

步骤七:获取bus总线,阻塞函数直至总线触发错误或流结束后继续

  

步骤八:处理返回消息

  

步骤九:释放资源

  

 

关键函数

gst_element_factory_make()

  gst_element_factory_make 是 GStreamer 框架中的一个函数,用于创建 GStreamer 元素(Element)。GStreamer 是一个强大的多媒体框架,允许开发者构建媒体处理管道,而元素是这些管道的基本构建块。

GstElement* gst_element_factory_make(const gchar *factoryname, const gchar *name);
  • 参数一:要创建的元素的工厂名称。例如,如果想创建一个视频源元素,可以使用 “videotestsrc”
  • 参数二:为创建的元素指定一个名称。如果为NULL,GStreamer 会为该元素自动分配一个唯一的名称。
      成功时:返回指向新创建元素的指针(GstElement*),失败时:返回NULL。

gst_pipeline_new()

  gst_pipeline_new()是GStreamer框架中的一个函数,用于创建一个新的管道(Pipeline)。管道是 GStreamer 中用于连接和管理多个元素的核心结构,它定义了媒体数据从源到接收器的处理路径。

GstElement* gst_pipeline_new(const gchar *name);
  • 参数一:为创建的管道指定一个名称。如果为 NULL,GStreamer 会为管道自动分配一个唯一的名称。
      成功时:返回指向新创建管道的指针(GstElement*),实际上是一个GstPipeline 类型的对象,但通常通过 GstElement 指针来引用。失败时:返回NULL。

gst_bin_add_many()

  gst_bin_add_many()是GStreamer框架中的一个函数,用于将多个元素添加到一个GstBin(如GstPipeline)中。GstBin 是一个可以包含其他元素的容器,GstPipeline是GstBin的一种特殊类型,用于管理媒体处理流程。

guint gst_bin_add_many(GstBin *bin, GstElement *element_1, ..., NULL);
  • 参数一:指向目标 GstBin 的指针,通常是一个 GstPipeline。
  • 参数二(实际多个):可变参数,GstElement* 类型,要添加到bin中的元素列表,可变参数允许一次添加多个元素,最后一个参数必须是 NULL,以指示参数列表的结束。
      成功时:返回添加的元素数量(不包括最后的NULL)。失败时:如果任何元素无法添加,函数将返回 0,并且不会添加任何元素。

gst_element_link()

  gst_element_link() 是 GStreamer 框架中的一个函数,用于将两个元素链接在一起,以便媒体数据可以在它们之间流动。在 GStreamer 管道中,元素通过“链接”来形成一个处理链,数据从源元素流向接收器元素,经过各种处理步骤。

gboolean gst_element_link(GstElement *src, GstElement *dest);
  • 参数一:指向源元素的指针,数据将从该元素流出。
  • 参数二:指向目标元素的指针,数据将流入该元素。
      成功时:返回 TRUE。失败时:返回 FALSE。
 

Demo源码

#include <gst/gst.h>

Int main (int argc, char *argv[])
{
GstElement *pipeline, *source, *sink;
GstBus *bus;
GstMessage *msg;
GstStateChangeReturn ret; // 步骤一:初始化gst
gst_init (&argc, &argv); // 步骤二:创建组件
source = gst_element_factory_make("videotestsrc", "source");
sink = gst_element_factory_make("autovideosink", "sink"); // 步骤三:创建空管道
pipeline = gst_pipeline_new("test-pipeline"); if(!pipeline || !source || !sink)
{
g_printerr("Not all elements could be created.\n");
return -1;
} // 步骤四:管道连接组件,此处连接:源组件、接收组件
gst_bin_add_many(GST_BIN(pipeline), source, sink, NULL);
if(gst_element_link(source, sink) != TRUE)
{
g_printerr("Elements could not be linked.\n");
gst_object_unref(pipeline);
return -1;
} // 步骤五:修改源组件属性
g_object_set(source, "pattern", 0, NULL); // 步骤六:设置组件状态PALYING,开始播放
ret = gst_element_set_state(pipeline, GST_STATE_PLAYING);
if(ret == GST_STATE_CHANGE_FAILURE)
{
g_printerr("Unable to set the pipeline to the playing state.\n");
gst_object_unref(pipeline);
return -1;
} // 步骤七:获取bus总线,阻塞函数直至总线触发错误或流结束后继续
bus = gst_element_get_bus(pipeline);
msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS); // 步骤八:处理返回消息
if(msg != NULL)
{
GError *err;
gchar *debug_info; switch(GST_MESSAGE_TYPE(msg))
{
case GST_MESSAGE_ERROR:
gst_message_parse_error(msg, &err, &debug_info);
g_printerr("Error received from element %s: %s\n",
GST_OBJECT_NAME(msg->src),
err->message);
g_printerr("Debugging information: %s\n",
debug_info ? debug_info : "none");
g_clear_error(&err);
g_free(debug_info);
break;
case GST_MESSAGE_EOS:
g_print("End-Of-Stream reached.\n");
break;
default:
g_printerr("Unexpected message received.\n");
break;
}
gst_message_unref(msg);
} // 步骤九:释放资源
gst_object_unref(bus);
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(pipeline);
return 0;
}
 

工程模板v1.1.0

  

 

入坑

入坑一:无法连接g_type_check_instace_cast

问题

  未定义库,无法连接

原因

  这是gobject2.0库的

解决

  

GStreamer开发笔记(五):gstreamer创建组件、管道和总线实现简单的播放器的更多相关文章

  1. Django开发笔记五

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.页面继承 定义base.html: <!DOC ...

  2. Android开发6:Service的使用(简单音乐播放器的实现)

    前言 啦啦啦~各位好久不见啦~博主最近比较忙,而且最近一次实验也是刚刚结束~ 好了不废话了,直接进入我们这次的内容~ 在这篇博文里我们将学习Service(服务)的相关知识,学会使用 Service ...

  3. 【Gstreamer开发】用 GStreamer 简化 Linux 多媒体开发

    原文:http://www.ibm.com/developerworks/cn/linux/l-gstreamer/ 一.基本概念 GStreamer 作为 GNOME 桌面环境推荐的流媒体应用框架, ...

  4. 如何利用阿里视频云开源组件,快速自定义你的H5播放器?

    摘要: Aliplayer希望提供一种方便.简单.灵活的机制,让客户能够扩展播放器的功能,并且Aliplayer提供一些组件的基本实现,用户可以基于这些开源的组件实现个性化功能,比如自定义UI和自己A ...

  5. IOS开发之简单音频播放器

    今天第一次接触IOS开发的UI部分,之前学OC的时候一直在模拟的使用Target-Action回调模式,今天算是真正的用了一次.为了熟悉一下基本控件的使用方法,和UI部分的回调,下面开发了一个特别简易 ...

  6. HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器

    HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道 ...

  7. Android开发实战之简单音乐播放器

    最近开始学习音频相关.所以,很想自己做一个音乐播放器,于是,花了一天学习,将播放器的基本功能实现了出来.我觉得学习知识点还是蛮多的,所以写篇博客总结一下关于一个音乐播放器实现的逻辑.希望这篇博文对你的 ...

  8. jQuery MiniUI开发系列之:创建组件对象

    jQuery MiniUI可以使用Javascript和Html两种方式来创建对象. 1)Javascript创建对象 使用JavaScript创建对象,是最基本的方式,有如下几个要点: 1)使用ne ...

  9. 小学英语课文朗读APP开发笔记(一):创建Win7虚拟机

    1 缘起 以小米盒子为代表的OTT机顶盒.智能电视的快速普及,快速推动了Android技术在机顶盒.智能电视领域的普及.既然都是用的Android操作系统,那么从技术上来说应该是大同小异的,当然和手机 ...

  10. Android学习笔记五:四大组件(转)

    转自:http://blog.csdn.net/shenggaofei/article/details/52450668 Android四大组件分别为activity.service.content ...

随机推荐

  1. 130道基础OJ编程题之: 89~107

    130道基础OJ编程题之: 89~107 @ 目录 130道基础OJ编程题之: 89~107 89. BC101 班级成绩输入输出 99. BC102 矩阵元素定位 100. BC103 序列重组矩阵 ...

  2. docker pause 命令使用

    暂停正在运行的镜像容器 用途是在启动的容器的过程又的容器启动快了 有的还没有就绪 调试过程使用 a3: 正在运行的镜像容器简称 暂停: docker pause a3 解除暂停: docker unp ...

  3. Delphi 禁止重复运行程序的方法

    第一种方法,使用"过程调用" procedure Del; // 自定义过程 var Mutex: THandle; begin Mutex := CreateMutex(nil, ...

  4. Windows 左ctrl和左alt键互换

    reg代码 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyb ...

  5. MySQL 中 DATETIME 和 TIMESTAMP 类型的区别是什么?

    在MySQL中,DATETIME和TIMESTAMP都是用于存储日期和时间的类型,但它们有一些关键的区别: 1. 存储方式和范围 DATETIME: 存储的日期和时间值是以"年-月-日 时: ...

  6. 被LangChain4j坑惨了!

    最近在深度体验和使用 Spring AI 和 LangChain4j,从开始的满怀期待五五开,但最后极具痛苦的使用 LangChain4j,让我真正体验到了正规军和草台班子的区别. Spring AI ...

  7. 适用于LixtBox的,开启UI虚拟化时,某些时候需要定位到还没加载的项,比如自动选中某项,视图自动移过去等等

    1 /// <summary> 2 /// 将指定父级的下级索引元素,显示在视野下,使其可见 3 /// </summary> 4 /// <param name=&qu ...

  8. linux系统权限管理

    一.认识linux系统的文件权限 首先随便在一个目录下使用ls -l(可简写为ll)指令,就会把该目录下所有的文件和目录的权限显示出来,例如,在根目录下使用ls -l: (深蓝字:目录,白字:文件,浅 ...

  9. FastAPI数据库连接池配置与监控

    title: FastAPI数据库连接池配置与监控 date: 2025/04/28 00:13:02 updated: 2025/04/28 00:13:02 author: cmdragon ex ...

  10. Python 3.14 t-string 要来了,它与 f-string 有何不同?

    Python 最近出了个大新闻:PEP-750 t-string 语法被正式采纳了! 这意味着 Python 将在今年 10 月发布的 3.14 版本中引入一种新的字符串前缀 t,称为模板字符串(Te ...