前情提要:
视听体验再进化——如何在24小时内全面升级你的视频应用
如何打造新时代的终端播放产品?
随着VR、AR、元宇宙等新玩法的出现,Unity平台的视频播放需求逐渐增加,比如下面两个动图就是在百度真实的案例。前者是演唱会场景,后者则是一个演讲会场。
通过这两个案例可以真切地感受到虚实结合给传统视听体验带来的改变。
目前的Unity播放器方案有以下两种:
- Unity自带的VideoPlayer,但是缺点在于支持的格式少
- 海外一些公司推出的Unity播放器插件,比如AVPro,EasyMovieTexture等,格式支持丰富,但是费用不菲,而且海外公司的技术支持也有限
所以在网络上能看到很多文章,介绍如何自己实现Unity播放器SDK,基本都是如下的思路:
从硬件解码器中取出YUV数据 -> 送到Unity上下文中进行渲染。
这个思路非常简单直接,问题也很明显
- 在4K高分辨率下,无论是数据拷贝,还是CPU、GPU之间的数据传递,都会带来严重的性能损失。即便是低分辨率,在一些低性能设备上,也有严重的性能问题。
- 对于Android MediaCodec,严格来说取出YUV数据的做法并非标准做法,所以有些厂商(比如MTK)的实现会有各种各样的问题。给开发者埋了很隐蔽的坑。
高性能方案
鉴于以上的原因,我们在实际业务场景中寻求更高性能的方案。具体方案思路如下:
- 让Unity环境和播放内核共享渲染context
- 播放器内核将视频数据绘制到一个/多个纹理id上
- Unity拿到纹理id,进行渲染
这样的方式,避免了数据在CPU和GPU之间的拷贝,彻底解决了高分辨率视频渲染卡顿的问题。实测4K分辨率下CPU占用率能降低50%。
更进一步,完全的3D体验
VR、AR、元宇宙场景下,视频具备了3D体验,那为什么不更进一步,让音频也具备3D效果呢?
基于这样的思路,我们引入了6DoF全景声空间音频方案,6DoF中的x,y,z参数对应位移信息,yaw,pitch,roll对应旋转信息,如下图所示
在Unity场景中,根据观众与视频画面的空间位置,设定具体的6DoF参数,就可以让场景中的声音也具备空间感。
如此,我们就可以为用户带来视觉、听觉上完全的3D体验。
怎么使用
以上技术都已在百度智能云Unity播放器SDK中开放,并且已经在百度业务中等到了实际应用,文章开始的两个例子就是使用我们的SDK来完成的。
欢迎各位开发者接入、测试,共建更完美的VR/AR/元宇宙视听体验。