vlc源码分析(二) 播放流程
当点击播放文件或者输入要播放的文件后,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信息创建视频解码器和音频解码器。RTP数据到来后,经过Demux,分别放入两个fifo中,然后两个解码线程分别从各自的fifo中取出视频和音频数据解码。解码后的音频数据直接播放,解码后的视频数据放入picture_fifo_t中,由渲染线程负责显示。
附:
配置好的Windows版vlc工程下载:https://github.com/jiayayao/vlc_2.1.0-vs_2010,下载后使用vs2010可以直接编译运行,调试学习非常方便。
vlc源码分析(二) 播放流程的更多相关文章
- vlc源码分析(三) 调用live555接收RTSP数据
首先了解RTSP/RTP/RTCP相关概念,尤其是了解RTP协议:RTP与RTCP协议介绍(转载). vlc使用模块加载机制调用live555,调用live555的文件是live555.cpp. 一. ...
- vlc源码分析(七) 调试学习HLS协议
HTTP Live Streaming(HLS)是苹果公司提出来的流媒体传输协议.与RTP协议不同的是,HLS可以穿透某些允许HTTP协议通过的防火墙. 一.HLS播放模式 (1) 点播模式(Vide ...
- Duilib源码分析(六)整体流程
在<Duilib源码分析(一)整体框架>.<Duilib源码分析(二)控件构造器—CDialogBuilder>以及<Duilib源码分析(三)XML解析器—CMarku ...
- Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题
4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...
- 框架-springmvc源码分析(二)
框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...
- 十、Spring之BeanFactory源码分析(二)
Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...
- Okhttp源码分析--基本使用流程分析
Okhttp源码分析--基本使用流程分析 一. 使用 同步请求 OkHttpClient okHttpClient=new OkHttpClient(); Request request=new Re ...
- nodejs的Express框架源码分析、工作流程分析
nodejs的Express框架源码分析.工作流程分析 1.Express的编写流程 2.Express关键api的使用及其作用分析 app.use(middleware); connect pack ...
- openVswitch(OVS)源码分析之工作流程(哈希桶结构体的解释)
这篇blog是专门解决前篇openVswitch(OVS)源码分析之工作流程(哈希桶结构体的疑惑)中提到的哈希桶结构flex_array结构体成员变量含义的问题. 引用下前篇blog中分析讨论得到的f ...
- Tomcat源码分析二:先看看Tomcat的整体架构
Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...
随机推荐
- ‘Starting Tomcat v9.0 Server at localhost’ has encountered a problem.
上述错误是在将Web应用部署到Tomcat,最后一步 右键单击选择Start的时候报错,原因是我在启动Tomcat之前,就已经运行了Tomcat,导致端口被占用.将之前的Tomcat关闭重新启动就可以 ...
- C# Time Class using MySQL
http://www.csharphelp.com/2007/09/c-time-class/ /* datatypes. Time class is writen in C# and .NET 2. ...
- CentOS7运维管理笔记(12)----修改主机名
CentOS修改主机名 CentOS7和CentOS6.5 修改主机名的方法略有不同. 通过 hostname 命令可以查看当前的主机名. 1. 临时修改主机名 通过 'hostname 新的主机名' ...
- Word 关闭 Passive Voice
Sheryl prefers passive voice for some of her writing (such as business documents and correspondenc ...
- 如何提高 Java 中锁的性能
锁不是问题的根源,锁之间的竞争才是 通常在多线程的代码中遇到性能方面的问题时,一般都会抱怨是锁的问题.毕竟锁会降低程序的运行速度和其较低的扩展性是众所周知的.因此,如果带着这种“常识”开始优化代码,其 ...
- JS 根据子网掩码,网关计算出所有的IP范围
// 验证IP的正则 var ip_reg = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0- ...
- 1.Mysql简介
1.MySQL是一个关系型数据库管理系统. MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WE ...
- Java实例---简单的宠物管理系统
代码分析 Cat.java package com.ftl.petshop; class Cat implements Pet { private String name; private Strin ...
- C# 委托/Func() 中 GetInvocationList() 方法的使用 | 接收委托多个返回值
在日常使用委托时,有以下常用方法 方法名称 说明 Clone 创建委托的浅表副本. GetInvocationList 按照调用顺序返回此多路广播委托的调用列表. GetMethodIm ...
- zbrush书法文字硬边雕刻
方法的重点在与边缘环的操作以及模型网格的数量. 1.通过ZAppLink功能可以把制作的文字书法映射到模型上去. 2.遮罩,按照颜色强度遮罩. 3.分组,按照颜色分组.单独显示文字部分的分组.按Ctr ...