2022前端最新面试题知乎 2022前端最新面试题( 二 )


Chromium内核的Edge在Windows系统下,额外支持了硬解HEVC视频,但必须满足如下条件:
3.版本号必须大于等于Edge99 。
在安装插件后,进入edge://gpu页面,可以查看Edge对于HEVC硬解支持的Profile:
出现上图所示的字样,则证明硬解开启成功 。
指标:
优势:
劣势:
由于Apple是HEVC标准的主要推动者,因此早在17年的Safari11即完成了HEVC视频硬解的支持,无需安装任何插件开箱即用 。
指标:
优势:
劣势:
此类方案绝大部分基于WASM+FFMPEG编译实现,支持所有支持WASM的浏览器 。
指标:
优势:
劣势:
本文尝试直接为Chromium实现硬解,因为尽管Safari和Edge均已经实现了HEVC硬解,但它们均为闭源软件,无法被各种开源框架集成,而因为Chromium是开源的,这可以确保所有人可自行编译支持Windows/macOS/Linux硬解的Chromium/Electron/CEF,考虑到实现原理部分较长,因此如果你感兴趣,可直接下载预编译版本(-chromium-hevc-hardware-decoding/releases)进行测试(未来会被包含在Chrome正式版本内,预编译版本可供大家尝鲜提前试用,也可下载ChromeCanary),或跳到测评部分查看与Edge/Safari的对比 。
正是因为如上瓶颈,“让专业的人做专业的事”这句话同样适用视频解码,GPU硬解是很有必要的 。GPU解码的存在正是为了让解码工作可以充分利用显卡内部专用芯片,分担CPU解码时的压力,因此支持更多格式的硬解能力,已然成为众多显卡厂商的一大卖点 。
首先我们需要做一些调研,研究下目前硬解框架是如何存在,并支持哪些“系统”or“GPU” 。
下表来自FFMPEG项目对不同解码框架硬解支持情况的总结(来源:)
(硬解框架的支持情况,表格内容来自FFmpeg官网)
可以看到硬解框架五花八门,不同的显卡厂商和设备有各自的专用解码框架,操作系统也有定义好的通用解码框架,由于显卡厂商众多,因此大部分播放器一般均基于通用框架实现硬解,少部分播放器在人力充裕的情况可能会为了更好的性能(显卡厂商自己的框架一般比通用框架性能更好,但也不绝对)额外对专用框架二次实现 。
其中Windows平台通用的解码框架有MediaFoundation,Direct3D11,DXVA2,以及OpenCL 。macOS平台通用的解码框架只有一个,也就是苹果自己的VideoToolbox 。Linux平台的通用解码框架有VAAPI和OpenCL 。
显然,对于Chrome而言,为了更好的兼容性和稳定性,基于通用硬解框架实现硬解,更符合最小成本最大收益的目标,并提升了可维护性 。
根据ChromiumMedia模块简介可知,浏览器将音视频播放一共抽象成三种类型,我们比较常见的有:VideoElement标签,MSEAPI 。此外还有支持加密视频播放的EMEAPI,这三种在底层又存在多种复用关系 。
(Chromium的解码流程,图片来自Chromium代码仓库)
那么到了最底层的解码模块,整体逻辑大概可以简述为:
因此,为了实现HEVC硬解,我们首先需要找到各个平台的通用硬解Decoder:
在了解了大致背景后,便可以开始探索实现HEVC硬解实现了,考虑到Apple其最新AppleSilicon芯片专门实现了支持H.264、HEVC和ProRes的专用编解码媒体处理引擎,看在Apple这么努力的份上,我首先挑选了macOS平台来进行尝试 。
虽然Chrome没有直接实现HEVC解码能力,但由于其实现了FFMpegVideoDecoder,因此本质上任何FFMPEG可以播的视频,只要利用修改Chromium的方式为其添加FFMPEG解码器的入口,理论上均可以实现播放,此方案其实是本文硬解实现前开源社区最广为流传的一种方案,@斯杰的文章()内已有详尽介绍,由于当时的版本是基于Chromium79,目前最新的Chromium版本号为104,因此里面的一些实现有所变动,但整体逻辑并没有明显改变,通过修改Chromium104依然可以实现软解 。

推荐阅读