基于WebCodecs的网页端高性能视频截帧

这篇具有很好参考价值的文章主要介绍了基于WebCodecs的网页端高性能视频截帧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本期作者

基于WebCodecs的网页端高性能视频截帧,音视频,前端

业务介绍

web投稿页是B站的主要投稿来源,有很多高粉UP主使用web端进行投稿。

封面部分是投稿过程中耗时占比较高的步骤,因此在过去,web投稿页已上线了自动的封面截取&推荐功能,有效提升了用户体验。同时在此过程中有了一定的技术积累。

自动封面功能依赖于对用户上传视频进行截帧的能力,最简单的方式是在上传完成之后由服务端进行视频截帧并返回推荐的候选封面,但显然这一步会有大量的等待时间,因此我们采用的是纯前端视频截帧能力。

实际上在web投稿页有多处需要截帧的地方:

  • 封面推荐:截取多张低清图在前端进行AI打分,基于打分结果截取最多10张高清图供UP主选择

  • 封面选帧:对默认推荐的帧不满意,手动获取准确时间点的帧画面

  • 分区&话题推荐:从视频中截取多帧,打包上传至后台进行分析后返回推荐结果

基于WebCodecs的网页端高性能视频截帧,音视频,前端

基于WebCodecs的网页端高性能视频截帧,音视频,前端

过去方案

过去web投稿页采取两套视频截帧方案,wasm优先,canvas兜底

Video + Canvas

WebAssembly + FFmpeg

流程

  • Video标签 --> 设置video时间

  • canvas context 2d, drawImage()直接成图

FFmpeg API调用+数据传递为主

  • 视频文件解封装

  • 逐个读取关键帧图像数据

  • 数据层层传递

  • web端进行图像渲染(webgl / canvas)

优点

  • 开发简单:利用浏览器内部的视频播放器能力

  • 视频支持性好:几乎支持所有市面上可见的视频格式(行业标杆)

缺点

  • 无法进行错误处理,有时会黑屏,但不报错

  • 不同浏览器有形态各异的表现,速度和可用性难以保证

  • 播放器本身的缓存或预加载等机制带来性能浪费

  • 性能损耗大:相比canvas截帧慢;

  • 内存消耗大:早期的wasm功能甚至会导致页面崩溃;

  • 开发门槛高,需要了解ffmpeg lib的使用方式,要写C代码,需要手动构建各类基础库

现状:截帧成功率97%左右,封面推荐耗时(去掉极端数据)

  • 平均:8.4s

  • 50分位:16s

  • 90分位:19s

WebCodecs是什么

WebCodecs于21年9月份推出,是用于在web页面上对音视频进行底层操纵(如编解码)的API。

WebCodecs是相对底层的API,准确来说是为有音视频开发基础的人准备的,对前端同学来说有一定的门槛。

在使用FFmpeg时可直接调用包装好的方法,主要门槛在于wasm环境的配置和构建。而使用WebCodecs时则需要基于编解码的原理手动实现功能。或许后续WebCodecs将会推出更加上层的API。

所以在进一步介绍WebCodecs截帧方案之前,我想先介绍一些视频处理的入门知识,感兴趣的可以参考附录中的链接进一步学习。

MP4的入门知识

视频处理的基本概念

基于WebCodecs的网页端高性能视频截帧,音视频,前端

编码/解码:

  • 视频的编码是将原始的图像信息进行变换压缩等处理,方便传输并保证图像质量。解码则是将压缩后的文件还原成视频需要的一连串图像

  • 常见的编码格式:H.265; mpeg4; vp9 ……

封装/解封装:

  • 一个视频文件可能包含多个音频和视频流,通过封装格式将他们聚合在一起,在使用时按照规则逐步解析

  • 常见的封装格式:mov,mp4,m4a,3gp,3g2; matroska; flv; avi ……

在这里简单介绍下.mp4文件常用的h264编码以及MP4封装

编码-帧内编码(以JPEG图片压缩算法为例)

利用人眼的生物特性结合数学方法进行数据压缩,并确保图片质量。主要步骤:

基于WebCodecs的网页端高性能视频截帧,音视频,前端

具体流程在这就不展开了,总之,经过压缩后图片的文件大小将有非常显著的缩小

基于WebCodecs的网页端高性能视频截帧,音视频,前端

⬇️

基于WebCodecs的网页端高性能视频截帧,音视频,前端

原图大小:1620*1080*3/1024/1204 = 4.25MB ----> 编码后大小:856KB

PS:效果仅供参考,两者皆为经过JPEG压缩的图片,只不过压缩比不同

编码-帧间编码

尽管经过帧内编码的压缩,图片已经有了很明显的体积减少,但存储视频的每一帧是依然是很不明智的行为。因此需要帧间编码。

通常有两种方式进行帧间编码:动态补偿+帧间差异

动态补偿

基于WebCodecs的网页端高性能视频截帧,音视频,前端

通常,两个连续的帧之间是存在相同部分的,只是位置发生了变化因此可以通过存储 块的索引 + 偏移量(向量)以减少存储体积

帧间差异

仅有动态补偿还不够还原每一帧的画面,还需要通过两帧之间的diff帧来辅助还原

基于WebCodecs的网页端高性能视频截帧,音视频,前端

diff帧的画面通常信息量比较低,因此通过帧内压缩会获得很高的压缩比

使用这两种方法,结合上一帧参考帧,便可以获得当前帧了

基于WebCodecs的网页端高性能视频截帧,音视频,前端

不同的帧类型

对应的,产生了三种帧类型

I 帧:俗称的关键帧,仅使用了帧内编码,可以被独立还原为图像

P帧:帧的图像还原依赖前一帧的解码结果

B帧:帧的图像还原依赖前一帧与后一帧的解码结果

基于WebCodecs的网页端高性能视频截帧,音视频,前端

帧的展示顺序与解码顺序可能是不一样的

封装

MP4封装文件基本结构:所有数据存放在box中

基于WebCodecs的网页端高性能视频截帧,音视频,前端

WebCodecs截帧方案

设想一个问题:只使用一个编程语言的基本API,如何最高效地获取一个.mp4文件中的某一个时间点所在的图像?

在了解了上面的基本知识后,我们可以分4步解决这个问题:

基于WebCodecs的网页端高性能视频截帧,音视频,前端

不同于播放器:截帧不需要预解码缓存等步骤。为了保证性能,需要多少数据拿多少,拿多少处理多少,避免多余的文件读取和解析造成性能和内存的浪费。

 元数据读取&解析

1. 读取文件头部8byte的数据,按照box的header规则逐个获取各box的位置以及大小

基于WebCodecs的网页端高性能视频截帧,音视频,前端

PS:moov可能在文件的末尾,顺序不固定

2. 将moov box所在文件块切片,提供给解封装器解析,获取到:

  • 该视频的详细编码参数

  • 所有帧的索引信息

基于WebCodecs的网页端高性能视频截帧,音视频,前端

寻帧

策略:帧的时间戳并不是连续的的 → 某个时间点对应的帧可能并不存在 → 使用距离最近的帧

基于WebCodecs的网页端高性能视频截帧,音视频,前端

获取到最近的关键帧和非关键帧之后,则要根据截帧的需求提供不同的文件块给解码器解码

只提供关键帧速度更快,适合精度不高的场景(封面推荐),准确截帧适合精度要求高的场景(封面选帧)

整体过程

由于解封装器(mp4box.js)和解码器(WebCodecs-VideoDecoder)本身为流式设计,优先服务于流式的应用场景(如直播视频流,点播视频流,需要通过网络请求分块获取到文件内容)。而视频截帧是一个本地场景,已经有了完整的文件。且视频截帧的API最好是类似同步的方式,在一个方法调用中完成所有的帧截取,并一起返回。

因此设计了通过事件抛出以及定时器机制以达到对内部流式依赖库的包装。

同时将计算密集的解封装、解码、渲染工作挡在独立的web worker中执行,确保宿主页面运行流畅不受影响。

基于WebCodecs的网页端高性能视频截帧,音视频,前端

性能分析

本地测试:

测试机上模拟了web投稿页场景,对WebCodecs / WebAssembly / Canvas 三种截帧方式的性能进行了测试。

基于WebCodecs的网页端高性能视频截帧,音视频,前端

测试样本:720p视频2个,1080p视频3个,2k视频1个,4k视频3个

测试环境:2020 M1 MacBook pro, 公司测试windows本(i5-1135G7 1.38~2.40GHz)

测试方式:在不同测试机上对每个视频跑三次测试用例,共81次

测试用例:模拟web投稿页截帧流程,数量,分辨率保持相同

实际场景中:视频的编码,分辨率,压制参数等都会对截帧性能有影响,在这里以分辨率进行粗略的分类

线上数据:

基于WebCodecs的网页端高性能视频截帧,音视频,前端

基于WebCodecs的网页端高性能视频截帧,音视频,前端

总结:

  • 随着视频规格的提升,webcodecs的截帧速度为wasm和canvas的 2.5~5 倍

  • 提前 3~13s 完成页面所需的截帧任务,用户能够更快的看到推荐结果

  • 在内存消耗上有一定的降低

WebCodecs截帧方案的优点&缺点

优点

  • 速度很快,受视频规格影响小

  • 读取文件少

  • 内存占用有一定降低,且表现稳定

缺点

  • 依赖解封装器的实现,当前使用了mp4box.js作为解封装器,约能覆盖95%的视频

  • 目前仅mp4和webm的解封装器较完善

  • WebCodecs浏览器支持性一般,当前为85%左右

规划

  • 作为web投稿页首选截帧方式,根据线上表现做进一步优化

  • 其他封装格式的视频支持:支持webm封装格式(已支持,且开源了mkv demuxer)

  • 开源

附录

jpeg压缩算法介绍:

  • 我站:https://www.bilibili.com/video/BV1TZ4y1S7iG

  • 知乎:影像算法解析——JPEG 压缩算法 - 知乎(https://zhuanlan.zhihu.com/p/40356456)

视频编码介绍:https://www.youtube.com/watch?v=QoZ8pccsYo4

不同的帧类型:I, P, and B-frames - Differences and Use Cases Made Easy - OTTVerse(https://ottverse.com/i-p-b-frames-idr-keyframes-differences-usecases)

codec string的含义([avc1.4d0033]代表什么):Codecs in common media types - Web media technologies | MDN(https://developer.mozilla.org/en-US/docs/Web/Media/Formats/codecs_parameter#using_the_codecs_parameter)

MP4封装类型介绍:mp4封装格式各box类型讲解及IBP帧计算 - 知乎(https://zhuanlan.zhihu.com/p/457888765)

在线MP4解析工具:Online Mp4 Parser(https://www.onlinemp4parser.com/)

WebCodecs官方说明:WebCodecs(https://w3c.github.io/webcodecs/#videodecoder-interface)

WebCodecs代码示例:https://github.com/w3c/webcodecs文章来源地址https://www.toymoban.com/news/detail-833233.html

到了这里,关于基于WebCodecs的网页端高性能视频截帧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于高性能计算环境的HPC算力编程模式

    摘要 【目的】 随着云计算、大数据、人工智能等技术的兴起和广泛应用,促进了基于多元算力的融合计算发展。在国家“东数西算”战略的指引下,充分发挥HPC算力优势,提供新型HPC算力编程模式,是新一代计算基础设施可编程能力的重要变革。 【方法】 分析了高性能计算环境

    2024年02月02日
    浏览(60)
  • 字节跳动开源 Shmipc:基于共享内存的高性能 IPC

    动手点关注 干货不迷路 CloudWeGo - Shmipc 是字节跳动服务框架团队研发的 高性能进程间通讯库 ,它基于 共享内存 构建,具有 零拷贝 的特点,同时它引入的同步机制具有 批量收割 IO 的能力,相对于其他进程间通讯方式能明显提升性能。在字节内部,Shmipc 应用于 Service Mesh 场

    2023年04月08日
    浏览(48)
  • 基于Springboot3+微服务实现12306高性能售票系统

    💗博主介绍:全网CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者。 专注于Java、小程序技术领域和毕业项目实战💗 ✌Java、SSM+Vue、SpringBoot+Vue、NodeJS+Vue、微信小程序、Python、大数据、安卓。 你想要的我

    2024年02月20日
    浏览(77)
  • 高性能计算实验——矩阵乘法基于MPI的并行实现及优化

    熟练掌握MPI编程方法,并将通用矩阵乘法转为MPI并行实现,进一步加深MPI的使用与理解。 进一步熟悉MPI矩阵乘法的实现,学习MPI点对点通信与集合通信的异同点和各自的优缺点,学会比较二者的性能以及各自使用的情形。 学习如何将自己编写的代码改造为标准库函数,供其

    2024年02月03日
    浏览(55)
  • 网易NDH基于Impala的高性能SQL引擎建设实践

    导读:本文将从四个方面来进行介绍。首先是分析在网易NDH中使用 Impala 过程遇到的一些痛点;第二个部分是基于这些痛点问题,我们提出了建设高性能SQL引擎的方案,以及这些方案是基于什么原则来创建的;第三个是基于这些原则,我们做了哪些的优化实践的尝试;最后会

    2024年02月09日
    浏览(47)
  • 基于lvs+keepalived+nginx的web高性能集群项目

    模拟企业里的web项目需求,最终目的是构建一个高性能高可用的web集群系统。部署lvs负载均衡系统和keepalived高可用软件,后端使用nginx做web服务器,同时搭建内部的一套基于prometheus的监控系统。使用ansible实现整个集群系统的自动化运维工作。 ceotos7 nginx1.25.3 node_exporter-1.4.0

    2024年02月20日
    浏览(56)
  • 基于 Redis 实现高性能、低延迟的延时消息的方案演进

    🎉欢迎来系统设计专栏:基于 Redis 实现高性能、低延迟的延时消息的方案演进 📜其他专栏:java面试 数据结构 源码解读 故障分析 🎬作者简介:大家好,我是小徐🥇 ☁️博客首页:CSDN主页 小徐的博客 🌄每日一句: 好学而不勤非真好学者 📜 欢迎大家关注! ❤️ 随着

    2024年01月22日
    浏览(71)
  • 基于k8s的高性能高可用的web集群

    模拟公司里的k8s生产环境,部署web,MySQL,nfs,harbor,Prometheus,Jenkins等应用,构建一个高性能高可用的web集群 CentOS7,k8s,docker,Prometheus,nfs,jumpserver,harbor,ansible,Jenkins等 k8s-master:192.168.121.101 k8s-node1:192.168.121.102 k8s-node2:192.168.121.103 nfs:192.168.121.104 harbor:192.168.121

    2024年04月28日
    浏览(44)
  • 【大数据】Doris:基于 MPP 架构的高性能实时分析型数据库

    Apache Doris 是一个基于 MPP ( Massively Parallel Processing , 大规模并行处理 )架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于

    2024年02月11日
    浏览(59)
  • OpenResty安装-(基于Nginx的高性能Web平台,可在Nginx端编码业务)

    首先你的Linux虚拟机必须联网 首先要安装OpenResty的依赖开发库,执行命令: 你可以在你的 CentOS 系统中添加 openresty 仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum check-update 命令)。运行下面的命令就可以添加我们的仓库: 如果提示说命令不存在,则运行:

    2024年02月07日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包