HarmonyOS 鸿蒙Next中演示类应用如何降低音视频加载时延
HarmonyOS 鸿蒙Next中演示类应用如何降低音视频加载时延
1. 问题概述
演示类应用是用户在工作、学习中高频使用的应用,播放音视频则是用户使用演示类应用进行演示时的高频场景。由于音视频存在体积大、解码复杂等原因,演示类应用加载音视频时面临加载时延长、卡顿等问题。测试数据显示,对于一些大型高清的演示类文档,里面可能包含超过 1G 大小的大视频。而对于一些常用的演示类应用,演示时加载如此大视频的时延可能高达 10 秒,这也意味着应用在长达 10 秒内无法响应用户。一旦演示类应用在演示时出现不响应,用户可能会下意识地反复点击,导致演示过程严重混乱,这在一些重要的演示场合诸如学术报告、商业发布会下是不可接受的致命问题!
2. 优化思路
针对一些常用的演示类应用的音视频加载场景,我们使用 Hitrace 工具抓取泳道图和火焰图,并使用 SmartPerf 工具进行可视化分析。火焰图显示,演示类应用加载大型音视频耗时长的原因是多方面的,并非单一耗时点导致。我们梳理并分析后归纳出以下四大耗时点:
①演示类文档包含的音视频通常“嵌入”在文档中,而文档通常以压缩形式存储,演示时加载音视频首先需要解压缩音视频原文件,解压缩耗时较高;
②演示类文档包含的音视频体积可能相当大,演示类应用在演示时通常会将解压缩后的音视频原文件写入硬盘临时目录,写盘耗时较高;
③演示类应用通常支持丰富的演示功能(比如显示视频首帧、自定义视频播放起始时间等),这些功能普遍涉及获取音视频元数据,因此演示时应用可能会反复获取音视频元数据,这会导致较高的耗时;
④播放音视频需要进行音视频解码,这种计算密集型任务如果采用软解码会耗时较高。HarmonyOS 虽然支持硬解码,但需要额外的适配工作将演示类应用的音视频播放模块接入硬解码。
3. 优化实现
分析清楚了演示类应用加载音视频的主要耗时点,针对这些耗时点我们分别提出了对应的优化方法:
①针对耗时点①、②,即解压缩和写盘耗时高,可以将这两步放入异步线程执行;
②针对耗时点③,即反复获取音视频元数据耗时高,可以缓存音视频元数据以避免重复获取;
③针对耗时点④,即音视频软解码耗时高,可以将对应演示类应用的音视频播放模块接入 HarmonyOS 的硬解码能力。
3.1 异步解压和写盘的实现
①优化前原流程(主线程执行重任务会阻塞应用响应用户):
作为缓存Key
- 采用LRU策略管理缓存生命周期
- 对MP4/MOV等格式实现定制化解析缓存
- 硬件加速方案
- 通过OH_VideoDecoder接口接入系统硬解码
- 优先使用H.264/H.265硬件解码通道
- 合理设置surface渲染目标
- 实现输入/输出buffer环形队列管理
- 混合解码策略
- 建立格式白名单优先使用硬解
- 异常时自动降级到软解
- 预加载关键帧降低首帧延迟
实测表明该方案可使1GB视频加载时延从10s降至2s内,首帧显示速度提升5倍。需要注意缓存一致性维护和硬件解码格式兼容性检查。