Chromium HTML Video 媒体播放代码梳理

news2025/7/9 9:06:23

经过一番探索(参见Android 10 WebView 踩坑实录),终于搞定 Chromium WebView 的代码下载和编译问题,加下来就要向 H265 8K 高清播放发起冲锋。

不过在打开 Chromium 源码后,眼前一黑。这还是熟悉的 Chromium 代码吗?虽然我尽量选择了不那么新的代码,但我还是低估了谷歌工程师的努力程度,至少在 HTML Video 方面,代码结构已经改得面目全非。没办法,只能慢慢啃。

在开始梳理代码之前,先上一张图镇楼。

5857be2e72c5790589b96e5c2568f3f6.png

图中,红线框起来的内容是我需要着重关注的。

Chromium HTML Video 相关的代码主要分布在三处。

首先是 third_party/blink ,这个是从之前的 WebKit 演进而来,自从和 WebKit 分道扬镳后,谷歌将新浏览器引擎命名为 blink。经过魔改,现在的代码结构和原来差异已经很大。浏览器的排版和渲染相当复杂,所以 blink 的代码及其庞杂。我们需要重点关注以下代码:

  • renderer/core/html/media : 其中最重要的两个类 HTMLVideoElement 和 HTMLMediaElement,对应的是网页中的 video 元素。这里是研究 HTML Video 播放的起点。

  • public/platform : 这里面主要定义了一些需要外部实现的接口,比如 WebMediaPlayer。blink 引擎专注于网页的排版和渲染,其它的工作都是 delegate 到外部(主要是 content 模块)完成。

其次是 content/ , content 模块主要处理 Browser 进程和 Renderer 进程之间的交互、层的合成。具体的媒体处理并不在这,Content 只是作为桥梁。这里面的代码虽然非常复杂,但通常不需要修改,只要从总体上把握代码的走向即可。

最后,最重要的模块登场,代码位于 media/ 下,里面还有很多子目录,主要包含与媒体捕获和播放相关的组件集合。以前的实现相对比较简单,将 URI 丢给 Android 的 MediaPlayer 处理。而现在则要处理流的解析、demux、渲染、解码、音视频同步,等等。由于 chromium 支持的平台很多,功能很多,有一些代码是和视频捕捉、cast、加密流等有关,所以下面只列出一些与 HTML Video 播放相关的代码目录:

  • audio/ - 音频输入和输出代码。包括特定于平台的输出和输入实现。

  • base/ - meidia 基础类,包含 media 用到的各种枚举、实用程序类和基础类型;比如 AudioBus、AudioCodec 和 VideoFrame,等等。

  • blink/ - 用于与  blink 中的和对接。仅在与 Blink 相同的进程中使用;通常是渲染进程。

  • ffmpeg/ - ffmpeg 是一个非常流行的媒体框架库,代码位于 //third_party/ffmpeg,这里提供封装和辅助方法,这样别的模块不用直接调用 ffmpeg 的接口,也有利于切换到其他的媒体框架库。

  • filters/ - 包含用于媒体播放的数据源、解码器、多路分解器、解析器和渲染算法。

  • formats/ - 各种媒体格式解析器。

  • gpu/ - 包含平台硬件编码器和解码器实现。

  • renderers/ - 将音频和视频渲染到输出接收器的代码。

  • test/ - 用于测试媒体播放管道的代码和数据。

  • tools/ - 独立的媒体测试工具。

  • video/ - 抽象硬件视频解码器接口和工具。

一次典型的 HTML Video 播放过程如下:

  1. 从 third_party/blink/ 中的 blink::HTMLMediaElement 开始,经过 content::MediaFactory 短暂跳转后到达 media::WebMediaPlayerImpl, media::WebMediaPlayerImpl 实现了 third_party/blink/public/platform/media/ 中定义的 blink:: WebMediaPlayer。每个 blink::HTMLMediaElement 都拥有一个 media::WebMediaPlayerImpl 来处理诸如播放、暂停、搜索和音量变化(以及其他事情)之类的事情。

  2. media::WebMediaPlayerImpl 处理或委托网络上的媒体加载以及多路分解器和管道初始化。media::WebMediaPlayerImpl 拥有一个 media::PipelineController,它在播放期间管理 media::DataSource、media::Demuxer 和 media::Renderer 之间的协作。

  3. 在正常播放期间,WebMediaPlayerImpl 拥有的 media::Demuxer 可能是 media::FFmpegDemuxer 或 media::ChunkDemuxer。ffmpeg 变体用于标准 src= 播放,其中 WebMediaPlayerImpl 负责通过网络加载字节。media::ChunkDemuxer 与媒体源扩展 (MSE) 一起使用,其中 JavaScript 代码提供多路复用字节。

  4. media::Renderer 通常由 media::RendererImpl 实现,它拥有并协调 media::AudioRenderer 和 media::VideoRenderer 实例。其中每一个依次拥有一组 media::AudioDecoder 和 media::VideoDecoder 实现。每个向由 media::Demuxer 公开的 media::DemuxerStream 发出异步读取,media::DemuxerStream 由 media::DecoderStream 路由到正确的解码器。解码也是异步的,因此解码后的帧会在稍后的某个时间传送到每个渲染器。

  5. media/ 库包含所有支持的 Chromium 平台的 media/gpu 中的硬件解码器实现,以及 FFmpeg 和 libvpx 支持的 media/filters 中的软件解码实现。按照 media::RendererFactory 提供的顺序尝试解码器;第一个报告成功的将用于播放(通常是视频的硬件解码器)。

  6. 每个渲染器分别通过事件驱动的 media::AudioRendererSink 和 media::VideoRendererSink 接口管理音频和视频的计时和渲染。这些接口都接受回调,当需要新的音频或视频帧时,它们将定期发出回调。

  7. 在音频方面,同样在正常情况下,media::AudioRendererSink 是通过浏览器进程拥有的 base::SyncSocket 和共享内存段驱动的。该套接字由媒体/音频中的 media::AudioOutputStream 的平台级实现定期触发。

  8. 在视频方面,media::VideoRendererSink 由合成器向 media::VideoFrameCompositor 发出的异步回调驱动。media::VideoRenderer 将通过 media::TimeSource 与 media::AudioRenderer 对话,以协调音频和视频同步。

至此,整个播放流程梳理完毕,但其中还牵涉到很多细节。这需要一点一点,耐心阅读源码。更多的时候,遇到问题,找到问题相关的源码,解决问题。

接下来,我将要向 H265 8K 视频解码发起冲锋,敬请关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KEIL5中头文件路劲包含问题

方式1:1.Keil中添加头文件相对路劲的方法在c/c配置中添加路劲,最终是将添加的绝对路径转化为相对路径;注意:相对路径的当前位置指.uvproj文件所在位置在C/C配置中的include paths”中添加工程所用的所有头文件的路径;2…

45岁VP:1000页PPT 10节实战课程,江湖再见!

与时舒卷,与光同尘 知识星球3年已满,受兄弟的盛请于是有了这2年10节课程 10节课程1000页自写的PPT20年的经验,N个企业不同行业的切身实际案例,王者课程,分享后江湖再见,华丽转身。 第1课 百万年薪CIO成长&…

线程、进程、协程的总结详细

线程、进程、协程的总结详细1 、进程1.1 进程是什么呢?1.2 生命周期1.3 进程同步机制1.4 进程通信机制1.4.1 管道1.4.2 消息队列1.4.3 共享内存1.4.4 信号量和PV操作1.4.5 信号1.4.6 socket1.4.7 总结 Linux 内核提供的进程通信机制2、线程2.1 线程是什么呢&#xf…

王道计算机组成原理课代表 - 考研计算机 第四章 指令系统 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 计算机组成 知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!! 关于对 “指令系统” 章节知识点总结的十分全面,涵括了《计算机组成原理》课程…

【GeoDjango框架解析】conda环境下安装psycopy2版本问题

GeoDjango框架解析 【GeoDjango框架解析】配置geodjango开发环境 【GeoDjango报错处理】conda环境下安装psycopy2版本问题 文章目录GeoDjango框架解析前言一、报错:OSError: /usr/lib/libgdal.so: undefined symbol: TIFFReadRGBATileExt, version LIBTIFF_4.0二、…

代码随想录-52-257. 二叉树的所有路径

目录前言题目1.递归和回溯2. 本题思路分析:3. 算法实现4. pop函数的算法复杂度5. 算法坑点前言 在本科毕设结束后,我开始刷卡哥的“代码随想录”,每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。 代码随想录此题链接 题…

【数字孪生百科】每周认识一个数字孪生要素 ——柱形图(Histogram, Column Diagram)

简介柱形图(Histogram, Column Diagram),又称柱状统计图、条状图、长条图或者条形图,是一种以宽度相同的长方形的长度为变量的统计图表。一般来说,柱形图只有一个变量,比较适用于较小数据集的分析。柱形图同…

HHO:闯进耳机赛道的外行人,却给整个行业带来了光

数字化时代的耳机,应该是什么样的?如果是一位在行业浸润多年的专业人士,对这个问题给出的答案应该是:更加细腻真实的音质、更好的降噪效果、更舒适的佩戴体验……作为原阿里巴巴集团副总裁、钉钉创始人CEO,踏上创业之路…

【RuoYi-Vue-Plus】学习笔记 49 - Easy Excel(三)自定义转换器 ExcelDictConvert 源码分析

文章目录前言参考目录框架集成1、Maven2、框架集成模块 ruoyi-common-excel2.1、自定义转换器 ExcelDictConvert2.2、自定义转换器注解 ExcelDictFormat2.3、Excel 工具类 ExcelUtil3、测试方法3.1、用户导入3.2、用户导出3.3、测试调用流程说明执行流程分析1、用户导出流程分析…

Dynamics 365如何动态设置表单上字段标签label的tooltips提示语。

客户要求定制一下光标放在字段标签上的tooltips提示语言。如果是静态的,可以去后台实体字段编辑页面直接修改字段的描述信息即可。 但是这里要求改成动态的显示形式:“ABC”当前用户当前时间的yyyyMMddHHmm格式的字符串。 表单onload中调用的JS函数Rese…

第十四届蓝桥杯第三期模拟赛B组C/C++原题与详解

文章目录 一、填空题 1、1 找最小全字母十六进制数 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 给列命名 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 日期相等 1、3、1 题目描述 1、3、2 题解关键思路与解答 1、4 乘积方案数 1、4、1 题目描述 1、4、2 题解关…

centos7 oracle19c安装 ORA-01012: not logged on

总共分三步 1.下载安装包:里面有一份详细的安装教程 链接:https://pan.baidu.com/s/1Of2a72pNLZ-DDIWKrTQfLw?pwd8NAx 提取码:8NAx 2.安装后,执行初始化:时间较长 /etc/init.d/oracledb_ORCLCDB-19c configure 3.配置环境变量,不配置环境变量,sq…

Java介绍,什么是Java?

同学们好! 第一次接触软件行业吗?没有关系,看完这篇介绍让你了解到底什么是Java?并对它强大的功能所吸引。希望你能耐心的看完,更了解软件行业,了解Java开发。 1、是不是不知道什么是Java? 官…

港科夜闻|沈向洋教授获委任为香港科大校董会主席

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、沈向洋教授获委任为香港科大校董会主席。该委任由2023年3月6日起生效,为期3年。沈教授将接替现任校董会主席廖长城先生。而廖先生亦于今天获委任为大学最高咨询机构「顾问委员会」的新一任主席,接替成…

pandas数据分析(二)

文章目录DataFrame数据处理与分析读取Excel文件中的数据筛选符合特定条件的数据查看数据特征和统计信息按不同标准对数据排序使用分组与聚合对员工业绩进行汇总DataFrame数据处理与分析 部分数据如下 这个数据百度可以搜到,就是下面这个 读取Excel文件中的数据 …

JVM实战OutOfMemoryError异常

目录 Java堆溢出 常见原因: 虚拟机栈和本地方法栈溢出 实验1:虚拟机栈和本地方法栈测试(作为第1点测试程序) 实验2:(作为第1点测试程序) 运行时常量池和方法区溢出 运行时常量池内存溢出 …

模型压缩技术综述

当今,随着深度学习技术的不断进步,越来越多的大型多模态模型被应用于自然语言处理、计算机视觉等领域。然而,这些模型往往需要数十亿甚至上百亿的参数,不仅训练时间长、计算资源消耗大,而且在实际应用中也会受到硬件、…

android sdk分析工具uiautomatorviewer.bat启动报错

位于android sdk目录android-sdk\tools\bin下的分析工具uiautomatorviewer.bat启动报错: uiautomatorviewer.bat -Djava.ext.dirs..\lib\x86_64;..\lib is not supported. Use -classpath instead. Error: Could not create the Java Virtual Machine. Error: A fa…

20张图带你彻底了解ReentrantLock加锁解锁的原理

哈喽大家好,我是阿Q。 最近是上班忙项目,下班带娃,忙的不可开交,连摸鱼的时间都没有了。今天趁假期用图解的方式从源码角度给大家说一下ReentrantLock加锁解锁的全过程。系好安全带,发车了。 简单使用 在聊它的源码…

浅谈Spring6之P和C命名空间注入的区别

基于P命名空间注入 P命名空间注入是简化构造方法的注入 使用P命名空间注入的两个条件 一&#xff1a;xmlns:p"http://www.springframework.org/schema/p" 二&#xff1a;提供set方法class类 Spring_p.xml配置<!--P命名注入底层是set注入><bean id"dogB…