Chromium Media Player

来源:互联网 发布:java自己设计流程引擎 编辑:程序博客网 时间:2024/05/16 17:55

近来在搞Chromium的Media Player,本来想好好写点东西,可是一直也没有组织好如何写,世事变迁,弄不好过些日子又去搞别点什么了,即使是半成品也贴出来吧,总比什么都没有留下来强。

1        Overview

Chromium是由Google维护的一个浏览器项目,由于本文主要就是想记录一下近期阅读其媒体处理部分代码的心得,所以其诸多长处也就没有必要在这里描述了。Chromium的整个代码量非常庞大,使用VC++打开有600来个工程,完全编译也需要耗时几个小时,但是我感觉Google其实就是做了一个融合的工作,把很多优秀的开源项目及已有技术恰到好处的为己所用,当然这需要有很丰富的经验及架构能力。Chromium的媒体处理解码用的是ffmpeg,其主要的代码集中在src/media目录下。

1.1  Run a Sample

Chromium支持hteml5,所以我们可以写一个包含video标签的html把Chromium中MediaPlayer运行起来看看效果,代码如下:

  

<!DOCTYPE HTML>

<html>

<body>

<video src="bear.ogv" width="320" height="240" controls="controls" autoplay="autoplay">

   Your browser does not support the video tag.

</video>

</body>

</html>

 










由于版权等的问题从Chromium Project下载来的代码在ffmpeg中只打开了对于ogv格式的支持,所以这里使用ogv作为video source,其中bear.ogv在Chromium的源码目录中可以找到。如果想支持更多格式可以自己配置ffmepg并重新编译即可,ffmepg的代码在src/Third_party/ffmpeg目录下。上面的例子成功运行的效果如下:


2        Code Read

2.1  理解的边界

对于复杂系统的理解我们一般需要设定一个边界,只理解边界以内的,这样会使理解相对简单,就像我们看由于工作的需要及理解的有限,我主要关注的是MediaPlayer的Video部分,对于Audio关注的比较少,但是在整体的框架上应该是相同的,使用Class Diagram和Sequence Diagram来说明MediaPlayer的整体结构及运行的逻辑。另外由于Chromium的代码实在庞大且是个多进程多线程的系统,为了实现解耦及可扩展性还包装了很多层次,很多的任务调用都使用到了回调及状态机等机制,对于一个调用要想完全的追根溯源有很大难度,而且由于我的关注点在MediaPlayer,所以很多时候把MediaPlayer以外的调用者就作为Actor了,这样在一定的Level上理解简单一些。很多调用是由WebMediaPlayerClientImpl类发起的,所以把WebMediaPlayerClientImpl的方法作为Actor。

2.2  WebMediaPlay的边界

上面这张图体现的一些类应该属于MediaPlayer整个框架的High Level,说明MediaPlayer与Chromium整体的一些关联。其中WebMediaPlayerImpl是实现MediaPlayer的类,用户对于MediaPlayer的操作最终都会分派到它去具体执行,之后就会具体的调用到Demux/ Decoder/ Renderer等。



下面是几张Call stack