经过一番探索(参见Android 10 WebView 踩坑实录),终于搞定 Chromium WebView 的代码下载和编译问题,加下来就要向 H265 8K 高清播放发起冲锋。
不过在打开 Chromium 源码后,眼前一黑。这还是熟悉的 Chromium 代码吗?虽然我尽量选择了不那么新的代码,但我还是低估了谷歌工程师的努力程度,至少在 HTML Video 方面,代码结构已经改得面目全非。没办法,只能慢慢啃。
在开始梳理代码之前,先上一张图镇楼。
图中,红线框起来的内容是我需要着重关注的。
Chromium HTML Video 相关的代码主要分布在三处。
首先是 third_party/blink ,这个是从之前的 WebKit 演进而来,自从和 WebKit 分道扬镳后,谷歌将新浏览器引擎命名为 blink。经过魔改,现在的代码结构和原来差异已经很大。浏览器的排版和渲染相当复杂,所以 blink 的代码及其庞杂。我们需要重点关注以下代码:
其次是 content/ , content 模块主要处理 Browser 进程和 Renderer 进程之间的交互、层的合成。具体的媒体处理并不在这,Content 只是作为桥梁。这里面的代码虽然非常复杂,但通常不需要修改,只要从总体上把握代码的走向即可。
最后,最重要的模块登场,代码位于 media/ 下,里面还有很多子目录,主要包含与媒体捕获和播放相关的组件集合。以前的实现相对比较简单,将 URI 丢给 Android 的 MediaPlayer 处理。而现在则要处理流的解析、demux、渲染、解码、音视频同步,等等。由于 chromium 支持的平台很多,功能很多,有一些代码是和视频捕捉、cast、加密流等有关,所以下面只列出一些与 HTML Video 播放相关的代码目录:
一次典型的 HTML Video 播放过程如下:
至此,整个播放流程梳理完毕,但其中还牵涉到很多细节。这需要一点一点,耐心阅读源码。更多的时候,遇到问题,找到问题相关的源码,解决问题。
接下来,我将要向 H265 8K 视频解码发起冲锋,敬请关注!