vlc源码分析(二) 播放流程
2017-07-18 18:02
736 查看
当点击播放文件或者输入要播放的文件后,vlc会执行一系列的流程。
首先需要了解视频以及流媒体处理及播放的流程,由链接中的描述,视频以及流媒体处理时,首先要解协议(http,rtmp,rtsp等),然后是解封装(mp4,mkv,avi等),获得音频码流和视频码流,分别解码后,再根据时间戳进行同步。使用vlc点击播放后,就是这一系列的流程。
点击播放支持RTSP协议的摄像头后,vlc会开启线程对输入的文件或者url进行分析(src/playlist/preparser.c),根据视频源属性做一些准备工作,包括:
->InputSourceInit()
->input_SplitMRL()分解url
->demux_New()创建分离器,如果是一个mp4文件,则会动态加载libmp4库,以此类推
->demux_Control()调用libmp4的Control函数,以此类推
......
->InitPrograms()根据文件或url属性创建解码器(decoder),创建过程会加载对应模块
之后就是从网络或者本地获取数据,堆栈如下。从堆栈中可以看到,接收线程从网络中接收数据,如果数据有封包格式(如mp4,mkv,ts等,也就是编码后的裸数据),则首先进行的是解封装,将解封包后的数据组成block(可以理解为是一个结构体,这个结构体可以用来保存一帧图像,也可以用来保存一帧图像的一部分数据),放入数据fifo中;解码线程从数据fifo中取出block来解码,交由其他渲染模块去显示。不同的是,摄像头并没有封装视频格式,而是传输的编码后的裸数据。
同理,播放一个本地mp4文件的堆栈如下。播放本地文件就没有了解协议的步骤,但是使用了libmp4进行了拆包。
放入数据fifo中的数据还没有被解码,另外还有两个解码线程(音频和视频)不断的从各自的队列中取数据解码,视频解码线程的堆栈如下。解码线程首先从上述数据fifo中取出数据,使用已经根据数据源格式创建好的解码器解码,之后将解码后的数据放到图像fifo中。
最后是渲染线程的堆栈,渲染线程不断的从图像fifo中取出数据渲染到窗体上。
程序的整体框图如下。当RTSP session建立的时候,程序根据RTSP会话得到的SDP信息创建视频解码器和音频解码器,两个解码器有各自的fifo,用于存放需要解码的数据。RTP数据到来后,经过Demux,分别放入两个fifo中,然后两个解码线程分别从各自的fifo中取出视频和音频数据解码。解码后的音频数据直接播放,解码后的视频数据放入picture_fifo_t中,由渲染线程负责显示。
附:
配置好的Windows版vlc工程下载:https://github.com/jiayayao/vlc_2.1.0-vs_2010,下载后使用vs2010可以直接编译运行,调试学习非常方便。
http://www.cnblogs.com/jiayayao/p/6752388.html
首先需要了解视频以及流媒体处理及播放的流程,由链接中的描述,视频以及流媒体处理时,首先要解协议(http,rtmp,rtsp等),然后是解封装(mp4,mkv,avi等),获得音频码流和视频码流,分别解码后,再根据时间戳进行同步。使用vlc点击播放后,就是这一系列的流程。
点击播放支持RTSP协议的摄像头后,vlc会开启线程对输入的文件或者url进行分析(src/playlist/preparser.c),根据视频源属性做一些准备工作,包括:
->InputSourceInit()
->input_SplitMRL()分解url
->demux_New()创建分离器,如果是一个mp4文件,则会动态加载libmp4库,以此类推
->demux_Control()调用libmp4的Control函数,以此类推
......
->InitPrograms()根据文件或url属性创建解码器(decoder),创建过程会加载对应模块
之后就是从网络或者本地获取数据,堆栈如下。从堆栈中可以看到,接收线程从网络中接收数据,如果数据有封包格式(如mp4,mkv,ts等,也就是编码后的裸数据),则首先进行的是解封装,将解封包后的数据组成block(可以理解为是一个结构体,这个结构体可以用来保存一帧图像,也可以用来保存一帧图像的一部分数据),放入数据fifo中;解码线程从数据fifo中取出block来解码,交由其他渲染模块去显示。不同的是,摄像头并没有封装视频格式,而是传输的编码后的裸数据。
同理,播放一个本地mp4文件的堆栈如下。播放本地文件就没有了解协议的步骤,但是使用了libmp4进行了拆包。
放入数据fifo中的数据还没有被解码,另外还有两个解码线程(音频和视频)不断的从各自的队列中取数据解码,视频解码线程的堆栈如下。解码线程首先从上述数据fifo中取出数据,使用已经根据数据源格式创建好的解码器解码,之后将解码后的数据放到图像fifo中。
最后是渲染线程的堆栈,渲染线程不断的从图像fifo中取出数据渲染到窗体上。
程序的整体框图如下。当RTSP session建立的时候,程序根据RTSP会话得到的SDP信息创建视频解码器和音频解码器,两个解码器有各自的fifo,用于存放需要解码的数据。RTP数据到来后,经过Demux,分别放入两个fifo中,然后两个解码线程分别从各自的fifo中取出视频和音频数据解码。解码后的音频数据直接播放,解码后的视频数据放入picture_fifo_t中,由渲染线程负责显示。
附:
配置好的Windows版vlc工程下载:https://github.com/jiayayao/vlc_2.1.0-vs_2010,下载后使用vs2010可以直接编译运行,调试学习非常方便。
http://www.cnblogs.com/jiayayao/p/6752388.html
相关文章推荐
- vlc源码分析(二) 播放流程
- vlc源码分析(二) 播放流程
- vlc源码分析(一) RTSP会话流程
- Chromium源码--视频播放流程分析(拨开云雾)
- vlc源码分析之RTSP会话流程
- vlc播放流程分析
- vlc源码分析(一) RTSP会话流程
- Chromium源码--视频播放流程分析(WebMediaPlayerImpl解析)
- vlc播放流程分析--1
- android6.0源码分析之Camera API2.0下的Preview(预览)流程分析
- k8s源码分析-----kubelet pod处理流程
- Spark集群启动之Master、Worker启动流程源码分析
- PX4源码分析5_PX4启动流程
- Mybatis工作机制源码分析—一次select请求处理流程
- Hadoop0.21.0源码流程分析(3)-Task节点管理启动任务
- Android应用层View绘制流程与源码分析
- Android电话拨打流程源码分析
- MySQL连接查询流程源码分析
- [置顶] Activity布局加载流程源码分析(I)
- PHP yii 框架源码阅读(二) - 整体执行流程分析