在使用gstreamer的过程中,相信很多是都通过gst-launch-1.0直接使用playbin或者自建pipeline完成相应的播放测试,反而很少的会自己编写代码,其实,gst-launch-1.0帮助我们做了很多工作,在自己编写程序的时候,反而会忽略掉,比如我们要说的demux。
  demux,解复用器,我将它理解为解封装,在播放封装音视频的时候,一般都会需要先进行解封装,然后在解码、播放或者显示。但是,在解封装之前,由于demux并不事先知道音视频的格式,所以在代码中,通过gst_element_link_many()或者相关函数link element,发现在demux与下游element连接的时候返回是错误的。
  为什么呢?下面我们来看看,以qtdemux为例。
  首先我们看看qtdemux支持的pad信息,详细如下:

Pad Templates:SINK template: 'sink'Availability: AlwaysCapabilities:video/quicktimevideo/mj2audio/x-m4aapplication/x-3gpSRC template: 'video_%u'Availability: SometimesCapabilities:ANYSRC template: 'audio_%u'Availability: SometimesCapabilities:ANYSRC template: 'subtitle_%u'Availability: SometimesCapabilities:ANY

  细心的会发现,src pad是随机型的,就是说,qtdemux并不知道它的输出是什么,但是分别有这三种,在实际使用过程中,会根据输入数据相应的使用不同的src pad。
  而在我们link的时候,element间数据并没有流通,demux并不知道它的输出是哪种类型的src pad,自然的,link就会失败,但是,有没有办法解决呢,肯定有的,要不然在我们通过gst-launch-1.0自建pipeline的时候又怎么会可以正常播放呢,下面我们再来分析。
  在上面我们已经知道,demux的src pad是随机型的,那么,是什么时候知道src pad是什么类型呢。一般的,是在element从READY状态切换到PAUSED状态时,上游element的数据将会预流到demux,在这个时候,demux将会解析数据,然后配置stream信息,根据数据创建相应的src pad,完成这个操作之后,将会通过gst_element_add_pad()将pad添加到demux,奥秘就在这个函数了。
  在gst_element_add_pad()中,有以下这样的一行代码:

  /* emit the PAD_ADDED signal */g_signal_emit (element, gst_element_signals[PAD_ADDED], 0, pad);

  看到这里就明白了吧,在demux添加src pad的时候,将会通过上面的函数发送一个pad-added信号。然后我们在程序中,再接收这个信号,此时再进行link就可以了,简单实例代码如下:

static void qtdemux_pad_added_cb (GstElement *qtdemux, GstPad *pad, GstElement *mjpegdec)
{gst_element_link_pads(qtdemux, GST_PAD_NAME (pad), mjpegdec, NULL);
}int main(int argc, char *argv[])
{.../* 其实在这里link,只会link到filesrc和qtdemux,因为在qtdemux与后面的mjpegdec link会* 失败,函数就返回了,所以我下面再重新link,这个只是简单示例,实际应用自己商榷 */gst_bin_add_many(GST_BIN(pipeline), filesrc, qtdemux, mjpegdec, fbsink, NULL);gst_element_link(filesrc, qtdemux);gst_element_link(mjpegdec, fbsink);/* We'll want to know when the source pad is added */g_signal_connect (qtdemux, "pad-added", (GCallback) qtdemux_pad_added_cb, mjpegdec);...
}

  在程序中,通过g_signal_connect()函数绑接收”pad-added”信号的回调函数qtdemux_pad_added_cb()。而回调函数的函数又是怎样确定的呢?可以看到qtdemux_pad_added_cb (GstElement *qtdemux, GstPad *pad, GstElement *mjpegdec),第一个函数参数qtdemux是我们在g_signal_connect()的第一个参数,而第二个参数pad是在g_signal_emit()发送信号是传进来的参数pad,而第三个参数则是g_signal_connect()传进来的mjpegdec,所以,大家知道怎么编写信号回调函数了吧,这里是假设只有视频srcpad的,可能还会有音频或者字幕的,可根据GST_PAD_NAME (pad)得到pad的信息,再相应的link element。
  而为什么我们使用gst-launch-1.0会可以的,是因为在gstreamer-1.xx.x/gst/parse目录下的grammar.y文件进行了延迟link的操作,感兴趣的可以看看该文件的实现。

  以上是个人理解,有理解错误的地方,欢迎指出,感谢

gstreamer学习笔记---demux使用相关推荐

  1. gstreamer学习笔记---编码videoencoder

      既上一节的<gstreamer学习笔记-v4l2src>之后,我们这一次,学习gstreamer的编码流程.稍微了解gstreamer的小伙伴都知道,gstreamer具备强大的音视频 ...

  2. gstreamer学习笔记---v4l2src

      v4l2src element源码位于gst-plugins-good-xxx/sys/v4l2/gstv4l2src.c,v4l2src主要是从v4l2设备获取视频数据的element,基于v4 ...

  3. gstreamer学习笔记:将音视频合成MPEG2-TS流并打包通过rtp传输

    一.通过rtpbin插件发送 (1)发送端 gst-launch -v gstrtpbin name=rtpbin latency=100 mpegtsmux name="mux" ...

  4. Gstreamer学习笔记(4):pad定义、连接、流动

    pad相当于element的接口,各个element就是通过pad连接进行传输数据,同时pad会通过caps限制特定的数据类型通过,只有当两个pad的caps数据类型一致时才可以建立连接.那么pad在 ...

  5. gstreamer学习笔记---pad定义、连接、流动

      pad相当于element的接口,各个element就是通过pad连接进行传输数据,同时pad会通过caps限制特定的数据类型通过,只有当两个pad的caps数据类型一致时才可以建立连接.那么pa ...

  6. GStreamer学习笔记

    目录 前言 一.GStreamer编程接口介绍 二.gst-launch-1.0工具使用 总结 前言 GStreamer 是用来构建流媒体应用的开源多媒体框架(framework),其目标是要简化音/ ...

  7. gstreamer应用笔记

    gstreamer官网 https://gstreamer.freedesktop.org/ 应用手册 https://gstreamer.freedesktop.org/documentation/ ...

  8. Apache MiNa 2 学习笔记

    http://blog.csdn.net/cgwcgw_/article/details/18402769 http://download.csdn.net/detail/xiaozhu_1986/2 ...

  9. 2022最新树莓派4B学习笔记:系统备份 OpenCV SPI TFT HTML

    树莓派4B学习笔记 一.首次使用 1.系统烧录 2.优化配置与备份 3.一些基本操作 二.摄像头 三.Pi Dashboard好看的仪表盘 四.OpenCV安装编译 五.SPI_TFT屏幕 六.最终代 ...

最新文章

  1. 从概率论到Markov Chain Monte Carlo(MCMC)-- 转
  2. InfluxData【环境搭建 03】时序数据库 InfluxDB 离线安装配置使用(下载+安装+端口绑定+管理员用户创建+开启密码认证+开机自启配置)完整流程实例分享
  3. 电脑键盘按钮功能注释大全
  4. 前端学习(2671): vue3.0脚手架获取功能页面布局
  5. 腾讯面试Android必问11题,我说的,不信就来看看
  6. ubuntu 13.04安装注意事项和ROOT密码设置
  7. 六、访问CGI变量 (基础教程6)
  8. mysql function select 赋值_数据分析面试之mysql的分组排序和变量赋值顺序
  9. 用C#实现软件自动更新思路
  10. 科普:不给手游平台源码的公司能不能选?
  11. 35张动图:关于机房空调水冷系统和风冷系统
  12. DM6437烧写总结
  13. bochs运行xp_在bochs虚拟机中安装WindowsXP (学习)
  14. 三角形的几何公式大全_小学数学常用公式整理汇总(建议收藏)
  15. vue前端(element-ui),express后端实现上传图片到七牛云
  16. This view is not constrained It is olny designtime positions,so it will jump.......的解决方法
  17. 动态修改spine动画渲染层次
  18. 微信小程序-医护人员排班系统
  19. 法坤老师:百度网盘密道转存12.0群文件自动转存发布咯
  20. 使用杉川3i-T1单线激光雷达和Cartographer库SLAM问题及解决

热门文章

  1. html入门经典百度,html入门经典
  2. C# 读写文本文件乱码解决方案
  3. Performance 介绍及使用
  4. 日本零售的发展,给未来中国零售数字化转型带来哪些启发?
  5. 智能运维应用之道,告别企业数字化转型危机
  6. 输入python出现警告Warning: This Python interpreter is in a conda environment, but the environment has not
  7. 2023年女性最佳职场大中华区榜单公布,33家公司入选 | 美通社头条
  8. 基于 Canvas 的 HTML5 交互式地铁线路图
  9. mysql多表操作语句_MYSQL数据库语句之多表操作(三)
  10. matlab求线性方程组的符号解,Newton迭代法在MATLAB中解线性方程组