gstreamer学习笔记---demux使用
在使用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使用相关推荐
- gstreamer学习笔记---编码videoencoder
既上一节的<gstreamer学习笔记-v4l2src>之后,我们这一次,学习gstreamer的编码流程.稍微了解gstreamer的小伙伴都知道,gstreamer具备强大的音视频 ...
- gstreamer学习笔记---v4l2src
v4l2src element源码位于gst-plugins-good-xxx/sys/v4l2/gstv4l2src.c,v4l2src主要是从v4l2设备获取视频数据的element,基于v4 ...
- gstreamer学习笔记:将音视频合成MPEG2-TS流并打包通过rtp传输
一.通过rtpbin插件发送 (1)发送端 gst-launch -v gstrtpbin name=rtpbin latency=100 mpegtsmux name="mux" ...
- Gstreamer学习笔记(4):pad定义、连接、流动
pad相当于element的接口,各个element就是通过pad连接进行传输数据,同时pad会通过caps限制特定的数据类型通过,只有当两个pad的caps数据类型一致时才可以建立连接.那么pad在 ...
- gstreamer学习笔记---pad定义、连接、流动
pad相当于element的接口,各个element就是通过pad连接进行传输数据,同时pad会通过caps限制特定的数据类型通过,只有当两个pad的caps数据类型一致时才可以建立连接.那么pa ...
- GStreamer学习笔记
目录 前言 一.GStreamer编程接口介绍 二.gst-launch-1.0工具使用 总结 前言 GStreamer 是用来构建流媒体应用的开源多媒体框架(framework),其目标是要简化音/ ...
- gstreamer应用笔记
gstreamer官网 https://gstreamer.freedesktop.org/ 应用手册 https://gstreamer.freedesktop.org/documentation/ ...
- Apache MiNa 2 学习笔记
http://blog.csdn.net/cgwcgw_/article/details/18402769 http://download.csdn.net/detail/xiaozhu_1986/2 ...
- 2022最新树莓派4B学习笔记:系统备份 OpenCV SPI TFT HTML
树莓派4B学习笔记 一.首次使用 1.系统烧录 2.优化配置与备份 3.一些基本操作 二.摄像头 三.Pi Dashboard好看的仪表盘 四.OpenCV安装编译 五.SPI_TFT屏幕 六.最终代 ...
最新文章
- 从概率论到Markov Chain Monte Carlo(MCMC)-- 转
- InfluxData【环境搭建 03】时序数据库 InfluxDB 离线安装配置使用(下载+安装+端口绑定+管理员用户创建+开启密码认证+开机自启配置)完整流程实例分享
- 电脑键盘按钮功能注释大全
- 前端学习(2671): vue3.0脚手架获取功能页面布局
- 腾讯面试Android必问11题,我说的,不信就来看看
- ubuntu 13.04安装注意事项和ROOT密码设置
- 六、访问CGI变量 (基础教程6)
- mysql function select 赋值_数据分析面试之mysql的分组排序和变量赋值顺序
- 用C#实现软件自动更新思路
- 科普:不给手游平台源码的公司能不能选?
- 35张动图:关于机房空调水冷系统和风冷系统
- DM6437烧写总结
- bochs运行xp_在bochs虚拟机中安装WindowsXP (学习)
- 三角形的几何公式大全_小学数学常用公式整理汇总(建议收藏)
- vue前端(element-ui),express后端实现上传图片到七牛云
- This view is not constrained It is olny designtime positions,so it will jump.......的解决方法
- 动态修改spine动画渲染层次
- 微信小程序-医护人员排班系统
- 法坤老师:百度网盘密道转存12.0群文件自动转存发布咯
- 使用杉川3i-T1单线激光雷达和Cartographer库SLAM问题及解决
热门文章
- html入门经典百度,html入门经典
- C# 读写文本文件乱码解决方案
- Performance 介绍及使用
- 日本零售的发展,给未来中国零售数字化转型带来哪些启发?
- 智能运维应用之道,告别企业数字化转型危机
- 输入python出现警告Warning: This Python interpreter is in a conda environment, but the environment has not
- 2023年女性最佳职场大中华区榜单公布,33家公司入选 | 美通社头条
- 基于 Canvas 的 HTML5 交互式地铁线路图
- mysql多表操作语句_MYSQL数据库语句之多表操作(三)
- matlab求线性方程组的符号解,Newton迭代法在MATLAB中解线性方程组