Chromium源码--视频播放流程分析(拨开云雾)

转载请注明出处: http://www.cnblogs.com/fangkm/p/3791964.html

在PC浏览器中播放视频,大部分视频网站都是采用flash播放器,这多亏了Adobe Flash Player庞大的装机量。但Flash Player对于浏览器来说就是一个插件,插件内部下载flv流、解析flv视频格式、播放视频等流程与浏览器都没有太大关系。浏览器新标准HTML5中增加了视频支持,如:<video src="movie.ogg"> </video>,video 元素当前支持三种视频格式:Ogg、MPEG 4、WebM。下面分析下Chromium源码中视频的播放流程。

视频播放流程有点复杂,下面还是从源头一点一点摸索。当blink遇到<video> tag时,会创建对应的Element对象HTMLVideoElement,同样遇到<audio> tag时会创建HTMLAudioElement对象.(其他tag对应的创建对象请参见core/scripts/make_names.pl脚本生成的HTMLElementFactory.cpp文件)

HTMLVideoElement和HTMLAudioElement都是从HTMLMediaElement派生,接下来着重分析下

HTMLMediaElement类. 该类的结构图如下所示:

从结构可以看出,媒体播放逻辑抽象在MediaPlayer接口中, HTMLMediaElement的createMediaPlayer方法调用MediaPlayer的静态方法create来创建MediaPlayer对象,分析一下create的实现,其创建对象的逻辑依赖于由静态方法setMediaEngineCreateFunction

来指定,在初始化webkit的时候就通过该方法指定WebMediaPlayerClientImpl::create创建函数,从而最终创建WebMediaPlayerClientImpl对象来实现MediaPlayer接口逻辑。

然而WebMediaPlayerClientImpl也只是一层壳,它并没有真正的实现媒体相关逻辑,而是转接给WebMediaPlayer接口,相关结构如下:

WebMediaPlayerClientImpl通过依赖WebFrameImpl的WebFrameClient成员来创建WebMediaPlayer实现对象,通过WebMediaPlayerClient接口来响应WebMediaPlayer的相关事件, RenderViewImpl最终承接创建WebMediaPlayer的任务,其创建WebMediaPlayerImpl对象,并通过WebMediaPlayerDelegate接口来响应WebMediaPlayerImpl的相关事件。

下一篇文章开始分析WebMediaPlayerImpl部分, 这部分才真正开始音视频的相关逻辑。

Chromium源码--视频播放流程分析(拨开云雾)

时间: 2024-10-10 15:54:52

Chromium源码--视频播放流程分析(拨开云雾)的相关文章

Chromium源码--视频播放流程分析(WebMediaPlayerImpl解析)

转载请注明出处:http://www.cnblogs.com/fangkm/p/3797278.html 承接上一篇文章.媒体播放,需要指定一个源文件,html5用URL格式来指定视频源文件地址,可以是http链接,也可以使本地源文件(不能直接指定,需要借助blob二进制类型).播放网络文件比播放本地文件多了个下载流程, 所以下面直接分析网络文件的播放流程,本地文件的播放流程也就清楚了.首先分析下网络视频资源的加载流程,相关结构图如下: WebMediaPlayerImpl类有一成员Buffer

通过官方API结合源码,如何分析程序流程

通过官方API结合源码,如何分析程序流程通过官方API找到我们关注的API的某个方法,然后把整个流程执行起来,然后在idea中,把我们关注的方法打上断点,然后通过Step Out,从内向外一层一层分析调用链,然后找出我们要分析的流程的逆流程,然后再通过在每层上面打上断点,进而整理出代码的执行流程:其实,对于面向对象语言,由于有了多态特性,代码中有了很复杂的抽象结构,一个接口或者抽象类有很多的实现,有时通过代码可以看出来,有些不太好看,程序执行时到底调用了哪个实现类的方法,这就需要按照上面动态的方

[原创]chromium源码阅读-进程间通信IPC.消息的接收与应答

chromium源码阅读-进程间通信IPC.消息的接收与应答 chromium源码阅读-进程间通信IPC.消息的接收与应答 介绍 chromium进程间通信在win32下是通过命名管道的方式实现的,最后的数据都是以二进制流的方式进行传播,pickle类就是负责消息的封包与解包功能,它将各种数据已二进制的形式写到内存缓冲区中,在实际通信的时候通过与其他一些辅助类与模板函数来实现具体数据结构的写与读.本文主要介绍的是chromium在将消息发送与接收过程中,以及chromium如何通过各种消息宏与C

从源码的角度分析ViewGruop的事件分发

从源码的角度分析ViewGruop的事件分发. 首先我们来探讨一下,什么是ViewGroup?它和普通的View有什么区别? 顾名思义,ViewGroup就是一组View的集合,它包含很多的子View和子VewGroup,是Android中所有布局的父类或间接父类,像LinearLayout.RelativeLayout等都是继承自ViewGroup的.但ViewGroup实际上也是一个View,只不过比起View,它多了可以包含子View和定义布局参数的功能.ViewGroup继承结构示意图如

从源码上,分析AsyncTask的实现

Android开发者们应该都知道AsyncTask这个类,它是系统提供的一个异步任务类,可以方便的让我们实现异步操作.在本篇文章中,我将带大家进入源码,简单分析一下AsyncTask的实现. 首先,贴上AsyncTask类的源码: package android.os; import java.util.ArrayDeque; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Callable; impo

qt creator源码全方面分析(3-8)

目录 项目文件工作流程 多层目录模式 依赖解析模式 包含,链接和输出 包含 链接 输出 构建目录架构 项目文件工作流程 我们在前面已经讨论了所有的项目文件, qtcreator.pro qtcreator.pri qtcreatordata.pri qtcreatorlibrary.pri qtcreatorplugin.pri qtcreatortool.pri 下面我们再从头到尾来捋一遍. 多层目录模式 我们可以看到,所有的*.pro文件中,除了最底层的子项目.都采用TEMPLATE和SUB

chromium浏览器开发系列第二篇:如何编译最新chromium源码

说一下为什么这么晚才发第二篇,上周和这周department的工作太多了,晚上都是十点半从公司出发,回家以后实在没有多余的精力去摸键盘了.所以请大家包涵! 上期回顾: chromium源码下载: 1.找个靠谱的vpn(我试过了,网上说的不用vpn拿代码的都不靠谱): 2.获取depot_tools,解压,设置环境变量; 3.gclient获取python和git,svn,设置环境变量: 4.fetch–nohooks chromium –nosvn=true 获取源码: 5.gclientsyn

zabbix源码安装流程及报错解决方法

zabbix源码安装流程及报错解决方法 一. zabbix的介绍 1) zabbix是什么 zabbix是一款基于web页面的.开源的.企业级的,支持分布式部署的监控软件. 2)2.zabbix的作用 监控windows和Linux主机上的软硬件状态. 监控各网络设备,如路由器.交换机.防火墙.f5.打印机等. 支持邮件短信微信等平台发送告警通知. 通过web页面及图形展示监控数据. 3)zabbix的特性 由zabbix server和agent程序协同工作,还支持分布式监控,这时需要安装za

安卓图表引擎AChartEngine(二) - 示例源码概述和分析

首先看一下示例中类之间的关系: 1. ChartDemo这个类是整个应用程序的入口,运行之后的效果显示一个list. 2. IDemoChart接口,这个接口定义了三个方法, getName()返回值是listitem上显示的标题; getDesc()返回值是listitem上显示的描述内容. excute(context)返回值是一个Intent,当点击listitem后跳转到此Intent. 3. AbstractDemoChart类是一个抽象类,实现接口IDemoChart接口,这个类中封