基于afx透明视频的视觉增强前端方案

作者 | 青玉

导读

本文介绍了增长前端团队自研的Webview框架下透明视频视觉增强方案,该方案在保证对视觉进行高度还原的同时可投入更少的开发成本,还能获得更优的前端性能表现。文章首先分析了市面上动画方案的优缺点,然后详细介绍了透明视频的整体设计、实现方法、使用流程和在运营活动中的使用案例。该方案通过在视频中添加透明通道,利用OpenGL和Canvas实现了视频动画,同时通过资源的预加载和缓存优化了加载过程,开发者还可通过叠加svg和css3等其他技术进行氛围增强。希望给到前端同学在开发动效方面一点小小启发和助力。

全文3956字,预计阅读时间7分钟。

01 背景

随着App娱乐元素的不断增加和交互的日益丰富,动画效果在用户体验中的地位越来越重要。然而,实现高质量的动画效果需要较高的开发成本,且目前尚无通用的技术方案。为了解决这一问题,降低或消除动效相关的研发成本,业界逐渐诞生了基于afx透明视频的视觉增强前端方案。

02 整体方案设计

2.1 常见动画方案及问题

image.png

为了在项目中实现动画效果,目前业界现有的方案有:帧动画、lottie、gif、video等。这些方案中帧动画占用的体积较大,gif只支持8位色彩,画质比较粗糙,mp4是不支持透明背景,canvas/css对于复杂动效实现比较复杂,而动画引擎对我们项目来说开发成本以及设计成本都比较大。

参考百度APP和百度小程序在此方向的探索,更多H5应用场景下的我们自研了一套可在WebView环境允许,能够完美还原设计稿同时降低技术实现成本和门槛的透明视频方案。

2.2 实现方法

2.2.1 透明视频

首先,我们这边先介绍一下颜色通道和透明通道的概念。

在视频中,每一帧图像都可以被分解为多个颜色通道(RGB通道),如红、绿、蓝等。除此之外,还可以包含一个透明通道(Alpha通道),用于表示图像中各个像素的透明度。透明通道中的数值范围通常是0到255,其中0表示完全透明,255表示完全不透明。

mp4在默认的情况下,只存在RGB通道,不存在透明通道,所以我们需要在视频中额外开辟一个区域,去放置这些透明信息。

为了还原视频帧中的Alpha信息,我们在将序列帧合成视频时,将图像的RGB通道和Alpha通道分离,并将Alpha作为一张新图片的RGB值(新图片的RGB都等于原始图片的Alpha),然后将这两张图片合成为一张对称的图片。这样,在播放视频时就可以还原图片的Alpha信息,从而实现透明效果的动画。

image.png

2.2.2 动效资源的预加载以及缓存

对于需要重复播放的动效来说,资源的缓存以及资源的预加载是比较重要的。

对于<video>标签来说,src除了可以直接赋值一个网络URL外,还可以使用URL.createObjectURL来播放已经被下载到本地的blob文件。所以,我们可以通过提前下载资源文件来实现资源的预加载。

const loadVideo = async (path) =>{// 下载blob格式的mp4文件// 或者从indexdb中获取缓存的视频文件return blob;
}
const blob = await loadVideo(path);
path = URL.createObjectURL(blob);// 设置视频源
video.src = path;

同时,为了资源的缓存,我们可以利用indexDB存储我们下载的blob文件,所以整个动效的加载过程如下:先去判断本地indexDB中是否已经存在对应的视频资源,如果存在,则直接读取对应的文件,如果不存在,则去下载视频资源,同时将视频资源缓存到本地,方便后续播放时重复使用,节约下载时间;然后再将下载后的资源转换为对象URL,赋值给video标签。

image.png

2.3 使用流程

视觉同学制作完动效后,将AE文件导出为序列帧,再使用AFXCreater将序列帧合成为对应的产出文件。然后研发侧获得对应的视频文件后,在工程文件中使用afx sdk播放对应的动效文件。

在afx sdk1.0中,使用drawImage获得mp4的视频帧信息,然后再使用cpu去计算混合后的效果,导致在动效播放时会大量占用主线程的算力,导致页面会十分卡顿,页面fps只有十几,同时cpu占用经常达到100%。

后来为了优化性能,就改成使用OpenGL合成最终的rgba图片,这样页面fps就达到30~60fps。

image.png

03 现有案例

目前该方案大量运用到了增长的大型活动中,包括日常运营和多年的春节活动,累计14+。同之前的动效方案相比,实现一个复杂且还原度高的动效,开发成本从原本的2天缩短到0.5天,开发效率提升了75%。高度还原效果的同时也提高了视觉的产出效率,方便视觉在初始情况下,提供一个原始的动效视频给研发同学进行占位开发,在后期替换为正式的动效文件,这样让视觉的排期较为富裕,交付更加精美的动效。

在今年百度春节项目中,我们大量使用了该方案,并成功地完整复刻了视觉稿。以今年的《集好运分3亿》为例,今年项目中有5个复杂动效使用了afx方案,其余采用了css实现。

比如使用引导动效和转场动效,在利用afx方案高度还原动效后,技术再叠加css进行氛围动效渲染,并且为防止afx播放失败导致的页面异常,我们也会增加相应的兜底。

image.png

04 小结

基于afx透明视频的视觉增强前端方案是一种有效的还原高质量动画效果的方法。通过使用该方案,我们可以快速、低成本地实现具有透明背景的动画效果,提升用户体验。同时,该方案还具有资源体积小、性能优等特点,适用于各种场景视觉提升。在未来,我们还将不断优化该方案,叠加更多技术能力如css3,svg等进行氛围增强,以更好地丰富视觉效果。

——————END——————

推荐阅读

百度一站式数据自助分析平台(TDA)建设

浅析如何加速商业业务实时化

登录系统演进、便捷登录设计与实现

一文带你完整了解Go语言IO基础库

百度交易中台之系统对账篇

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

025——从GUI->Client->Server->driver实现对LED的控制

目录 1、添加服务器中对客户端数据的具体分设备处理 2、实现将数组中的某些位数据转化为整型 3、修改client和server&#xff0c;互相可处理LED 4、结合驱动程序实现对物理设备的控制 4.1 增加驱动处理句柄 4.2 连接驱动处理句柄和tcp通讯接口 4.3 在client端做对应处理…

OpenStack镜像管理与制作

一、OpenStack镜像服务 1、什么是镜像 镜像通常是指一系列文件或一个磁盘驱动器的精确副本。虚拟机所使用的虚拟磁盘&#xff0c;实际上是一种特殊格式的镜像文件。云环境下尤其需要镜像。镜像就是一个模板&#xff0c;类似于VMware的虚拟机模板&#xff0c;其预先安装基本的…

Pytorch(GPU版本)简介、安装与测试运行

目录 Pytorch简介Pytorch安装查看CUDA版本Pytorch命令安装Pytorch测试运行Pytorch简介 PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。 2…

Ctex+texmaker

最近要准备幻灯片&#xff0c;发现我喜欢的模板是用的Ctex&#xff0c;在Texlive下没有办法运行。 于是进行了很多尝试。最后找到一个快捷的办法&#xff0c;删掉自己笔记本中的texlive&#xff0c;在Ctex官网中下载Ctex套件(下载中心 – CTEX)&#xff0c;下载的版本是过时版…

初识数据库与数据库管理系统

实体的概念与数据库 实体(对象): 客观存在的事物都是实体实体数据的存储要求: 必须按照一定的分类和规律存储数据库: 专门用于存储这些实体的信息的数据集合数据库的特点: 海量存储数据&#xff0f;数据检索非常方便保持数据信息的一致&#xff0f;完整&#xff0f;并实现数据…

ubuntu22安装宝塔面板

方法一&#xff1a;运行安装宝塔命令 wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec 安装成功后&#xff0c;需到服务器管理后台的安全组中配置新规则&#xff0c;放行宝塔面板的端口&#xff08;以阿…

Spark-机器学习(2)特征工程之特征提取

在之前的文章中&#xff0c;我们了解我们的机器学习&#xff0c;了解我们spark机器学习中的MLIib算法库&#xff0c;知道它大概的模型&#xff0c;熟悉并认识它。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&a…

大学生前端学习第一天:了解前端

引言&#xff1a; 哈喽&#xff0c;各位大学生们&#xff0c;大家好呀&#xff0c;在本篇博客&#xff0c;我们将引入一个新的板块学习&#xff0c;那就是前端&#xff0c;关于前端&#xff0c;GPT是这样描述的&#xff1a;前端通常指的是Web开发中用户界面的部分&#xff0c;…

C++ 使用共享内存的进程通信方式模拟生产者消费者模型

编码环境如下 系统环境&#xff1a;linux 信号量&#xff1a;使用Linux操作系统的SystemV信号量 生产者代码如下 #include <iostream> #include <sys/sem.h> #include <sys/shm.h> #include <string.h>#define SEM_KEY 0x5678 #define SHM_KEY 0xAB…

适用于 Windows 的 10 个顶级 PDF 编辑器 [免费和付费]

曾经打开PDF文件&#xff0c;感觉自己被困在数字迷宫中吗&#xff1f;无法编辑的文本、无法调整大小的图像以及签署感觉像是一件苦差事的文档&#xff1f;好吧&#xff0c;不用再担心了&#xff01;本指南解开了在 Windows 上掌握 PDF 的秘密&#xff0c;其中包含 10 款适用于 …

图数据库Neo4J入门——Neo4J下载安装+Cypher基本操作+《西游记》人物关系图实例

这里写目录标题 一、效果图二、环境准备三、数据库设计3.1 人物节点设计3.2 关系设计 四、操作步骤4.1 下载、安装、启动Neo4J服务4.1.1 配置Neo4J环境变量4.1.2 启动Neo4J服务器4.1.3 启动Ne04J客户端 4.2 创建节点4.3 创建关系&#xff08;从已有节点创建关系&#xff09;4.4…

即插即用模块详解SCConv:用于特征冗余的空间和通道重构卷积

目录 一、摘要 二、创新点说明 2.1 Methodology 2.2SRU for Spatial Redundancy​编辑 2.3CRU for Channel Redundancy 三、实验 3.1基于CIFAR的图像分类 3.2基于ImageNet的图像分类 3.3对象检测 四、代码详解 五、总结 论文&#xff1a;https://openaccess.thecvf.c…