基于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基础库

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stm32实现hid鼠标

启动CubelMX 选择芯片&#xff08;直接输入stm32f103zet6) 设置时钟 如下图 usb设置 配置usb设备 调试端口设置 配置时钟 项目输出设置 打开工程&#xff08;后记&#xff1a;此工程含有中文不能编译通过) 配置项目 配置调试器 编译无法通过 删除路径中的中文&#xff0c;以及…

如何将Oracle 中的部分不兼容对象迁移到 OceanBase

本文总结分析了 Oracle 迁移至 OceanBase 时&#xff0c;在出现三种不兼容对象的情况时的处理策略以及迁移前的预检方式&#xff0c;通过提前发现并处理这些问题&#xff0c;可以有效规避迁移过程中的报错风险。 作者&#xff1a;余振兴&#xff0c;爱可生 DBA 团队成员&#x…

盲人专用软件定制开发:突破出行壁垒,点亮生活之路

身为一名资深记者&#xff0c;我始终关注着各类社会群体面临的挑战与应对策略。今天&#xff0c;我将目光投向了一个特殊群体——盲人&#xff0c;以及一款旨在破解他们独立出行难题的盲人专用软件。这款应用叫做蝙蝠避障&#xff0c;它通过定制开发&#xff0c;以先进的技术手…

Achronix FPGA增加对Bluespec提供的基于Linux的RISC-V软处理器的支持,以实现可扩展数据处理

Bluespec支持加速器功能的RISC-V处理器将Achronix的FPGA转化为可编程SoC 2024年4月——高性能FPGA芯片和嵌入式FPGA&#xff08;eFPGA&#xff09;硅知识产权&#xff08;IP&#xff09;领域的领先企业Achronix半导体公司&#xff0c;以及RISC-V工具和IP领域的行业领导者Blues…

PySpark预计算ClickHouse Bitmap实践

1. 背景 ClickHouse全称是Click Stream&#xff0c;Data WareHouse&#xff0c;是一款高性能的OLAP数据库&#xff0c;既使用了ROLAP模型&#xff0c;又拥有着比肩MOLAP的性能。我们可以用ClickHouse用来做分析平台快速出数。其中的bitmap结构方便我们对人群进行交并。Bitmap位…

0基础如何入门编程?

0基础如何进入IT行业 &#xff1f; 前言 简介&#xff1a;对于没有任何相关背景知识的人来说&#xff0c;如何才能成功进入IT行业&#xff1f;是否有一些特定的方法或技巧可以帮助他们实现这一目标&#xff1f; 主要方法有如下几点建议提供给宝子们 目录 免费视频网课学习…

记录一下hive跑spark的insert,update语句报类找不到的问题

我hive能正常启动&#xff0c;建表没问题&#xff0c;我建了一个student表&#xff0c;没问题&#xff0c;但执行了下面一条insert语句后报如下错误&#xff1a; hive (default)> insert into table student values(1,abc); Query ID atguigu_20240417184003_f9d459d7-199…

【HCIP学习】OSPF协议基础

一、OSPF基础 1、技术背景&#xff08;RIP中存在的问题&#xff09; RIP中存在最大跳数为15的限制&#xff0c;不能适应大规模组网 周期性发送全部路由信息&#xff0c;占用大量的带宽资源 路由收敛速度慢 以跳数作为度量值 存在路由环路可能性 每隔30秒更新 2、OSPF协议…

十大排序——11.十大排序的比较汇总及Java中自带的排序算法

这篇文章对排序算法进行一个汇总比较&#xff01; 目录 0.十大排序汇总 0.1概述 0.2比较和非比较的区别 0.3基本术语 0.4排序算法的复杂度及稳定性 1.冒泡排序 算法简介 动图演示 代码演示 应用场景 算法分析 2.快速排序 算法简介 动图演示 代码演示 应用场景…

shell编程-1

shell编程 1 初识shell 1.1 文件描述符与输出重定向 FD (file descriptor) FD值英文含义0Standard Input正确输入&#xff0c;并返回在前端1Standard Output正确返回值2Standard Error Output错误返回值 常见格式 a.txt 1>a.txt 标准正确输出到a.txt 2>a.txt 准错…

5_vscode+valgrind+gdb调试程序

需求 项目程序, 读取串口数据, 出现程序崩溃问题valgrind 可以调试定位内存问题: 内存泄漏,非法地址访问,越界访问等内存问题vscode gdb 可视化调试效果, 比命令行简单快捷很多期望使用vscode valgrind gdb 调试程序内存异常, 崩溃退出的问题 环境准备 sudo apt install v…

大话设计模式之解释器模式

解释器模式是一种行为设计模式&#xff0c;它用于解释语言的语法或表达式&#xff0c;将其转换为可执行的程序或操作。这种模式通常用于处理类似编程语言或规则引擎中的问题。 在解释器模式中&#xff0c;通常有两种角色&#xff1a; 解释器&#xff08;Interpreter&#xff0…

Linux网络基础(一)

网络发展 对于我们国家来讲&#xff0c;网络的发展&#xff0c;不仅仅是互联网公司在发展&#xff0c;提供重要推动力的还有三大运商 随之而来的是新设备的诞生。比如集线器&#xff0c;网线&#xff0c;光纤&#xff0c;调制解调器&#xff0c;路由器&#xff0c;防火墙&am…

盲盒小程序成为收益“法宝”?盲盒线上如何发展

近年来&#xff0c;盲盒在年轻人中掀起了一股潮玩热风&#xff0c;受到了不少年轻人的青睐&#xff0c;盲盒商品更是在不断创新中&#xff0c;收藏价值逐渐提高。随着市场规模的扩大&#xff0c;越来越多的玩家和商家涌入到了市场中&#xff0c;盲盒的商业模式正在加快发展中。…

VBA脚本: excel隐藏和展开指定行 【图文】

打开开发工具功能 【文件】-》【选项】-》【自定义功能区】-》勾选【开发工具】-》【确定】 代开VBA编辑器 【开发工具】-》【Visual Basic】 插入模块 编写代码 所有sheet 关闭 Sub HideRowsInAllSheets()Dim ws As WorksheetDim i As Integer 循环遍历所有工作表For E…

使用Python进行自动化测试【第163篇—自动化测试】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 如何使用Python进行自动化测试&#xff1a;测试框架的选择与应用 自动化测试是软件开发过程…

ubuntu+安装Google Protobuf 库

本文参考文章如下 https://blog.csdn.net/wzw1609119742/article/details/119712422#t18https://blog.csdn.net/j8267643/article/details/134133091https://blog.csdn.net/jax_fanyang/article/details/135937002?spm1001.2014.3001.5502 现在论坛上据大部分的教程都是下面…

java正则表达式教程

什么是正则表达式&#xff1a; 正则表达式是一种用来描述字符串模式的语法。在 Java 中&#xff0c;正则表达式通常是一个字符串&#xff0c;它由普通字符&#xff08;例如字母、数字、标点符号等&#xff09;和特殊字符&#xff08;称为元字符&#xff09;组成。这些特殊字符可…

ubuntu22安装宝塔面板

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

springboot整合dubbo实现RPC服务远程调用

一、dubbo简介 1.什么是dubbo Apache Dubbo是一款微服务开发框架&#xff0c;他提供了RPC通信与微服务治理两大关键能力。有着远程发现与通信的能力&#xff0c;可以实现服务注册、负载均衡、流量调度等服务治理诉求。 2.dubbo基本工作原理 Contaniner:容器Provider&#xf…