Android 视频 3D 示例代码





5.00/5 (4投票s)
在 Android 中,创建一个可以播放视频片段的应用非常简单,创建一个具有 3D 图形表面的游戏应用也很容易。但是,创建一个可以在 3D 图形对象上播放视频的应用并不直接。本文介绍了我创建的一个旨在应对这一挑战的应用。
引言
在 Android 中,创建一个可以播放视频片段的应用非常容易;创建一个具有 3D 图形表面的游戏应用也很容易。但是,在3D 图形对象上播放视频的应用并不直接。本文介绍了我创建的一个旨在应对这一挑战的应用。该应用在 3D 表面上渲染视频,并允许用户与视频表面进行交互。
为了实现这个应用,必须克服三个实现挑战。
- 如何构建代码,使用户可以在视频播放的同时更改 3D 表面。
- 尽管 Android 中默认的MediaPlayer 具备完善的播放功能,但无法获取视频图像数据并以定制的方式进行渲染。
- 如何设计图形组件来执行视频数据渲染?
该应用还挑战了设备的性能,因为它迫使视频和图形对象同时工作。本文将介绍该应用的功能和用法,然后简要描述其设计。
功能
该应用具有以下功能:
- 允许用户从本地媒体库中选择视频片段。
- 该应用支持竖屏和横屏布局;更改布局时,视频可以连续播放。
- 它有三种播放模式:
- 默认模式:这是正常的播放模式;视频片段的播放方式与普通媒体播放器相同。
- 随机旋转:视频表面会沿着水平和垂直轴随机旋转;颜色也会在红色调和正常颜色之间切换。
- 触摸旋转:用户可以通过触摸滑动来左右旋转表面,并改变速度。
- 当应用切换到后台或关闭时,当前片段可以被保存,并在应用重新激活时重新播放。
注意:没有视频会话控制;因此,用户无法停止、快进或快退视频。如果应用被切换到后台或停止,视频只能从头开始播放。
使用模型
开始播放视频片段
该应用不包含任何视频,因此用户可以选择 Android 平台支持的任何视频片段。但建议使用 MPEG-4 容器中的 H.264AVC 编码视频片段,因为这是开发期间测试的格式。首次启动应用时,将显示文件选择器屏幕(请参见上一页的屏幕截图)。
一旦用户选择了首选文件,屏幕上会显示操作指南。选择视频片段后,将开始播放。
注意:有时视频启动需要一段时间,大约 5-10 秒。
选择不同的模式
应用以普通模式启动。要更改模式,用户可以点击 UI 上的选项按钮来打开选项菜单。
选项菜单有四个选项:前三个是播放模式选项;最后一个选项允许用户选择不同的视频片段。
随机旋转
此选择会导致渲染视频的表面沿着水平和垂直轴以 3D 效果随机旋转。它还会周期性地在屏幕上投射红色调。
触摸旋转
在触摸旋转模式下,用户可以通过向左或向右滑动,使表面绕垂直轴向左或向右旋转。旋转速度会随着滑动速度的加快而加快,当用户停止滑动时会自然减速。
设计
该应用中的三个主要组件是:用于为用户提供应用交互式演示的 UI 组件;用于视频播放的视频组件;以及用于渲染视频帧缓冲并创建特殊模式下的 3D 效果的OpenGL* 表面。
视频播放组件有两个线程。视频引擎线程使用 MediaCodec 类。此类在 Android JellyBean 版本(API 16)中引入。它暴露了 Android 媒体框架的低级 API,以便可以逐帧控制播放。在每个视频帧上,图形组件都可以保存图像数据并改变图像的渲染方式。
播放组件还实现了一个音频引擎线程,用于播放视频片段的音频轨道。为了同步视频和音频线程,使角色说话时嘴唇与声音匹配,实现了 AV 同步算法。视频播放始终将其时间戳与音频时间戳进行比较。它会调整播放速度,使视频帧的延迟不超过 30 毫秒。
图形组件扩展了 GLSurfaceView,以便将自定义渲染类嵌入到该类中。渲染类实现了 Renderer 接口来执行 OpenGL 渲染算法。该算法在纹理表面上实现 3D 旋转效果,并根据用户输入将模式更改为不同的算法。
在渲染器中,视频帧的旋转和着色是通过简单的顶点和像素着色器处理的。视频平面的旋转是通过应用一系列欧拉角旋转来实现的。帧的着色是通过在像素着色器中混合视频帧内容和固定颜色(在本例中为红色)来实现的。
图形组件还充当视频引擎的视频帧监听器,并在构建过程中传递给 MediaCodec 对象,以便在每次有可用帧时调用渲染函数。图形组件在 UI 组件中有一个函数,使用户可以更改播放模式。
MediaCodec 解码过程以视频帧的速度进行,而图形组件中的渲染函数以图形帧的速度进行。因此,在访问帧缓冲时,两个组件中的函数必须同步。
相关链接和资源
- 将 OpenGL* 游戏移植到基于 Intel Atom 处理器的 Android* 设备
- Intel 架构上的 Android* MediaPlayer 示例代码演练
- 在 Intel 处理器图形上的 3D 游戏
- Intel Android* 开发者中心
要了解更多关于 Intel 为 Android 开发者提供的工具,请访问 Intel® Android 开发者中心。
关于作者
Mark Liu 曾在 Intel 超移动部门担任软件工程师,负责开发基于 Android 的设备上的验证框架。他还参与了 Intel 超移动部门的多个 Android 项目,包括智能手机和平板电脑设备。他所做的大部分工作都与媒体播放、视频会议和软件堆栈性能调优有关。
加入 Intel 软件与服务集团 Intel® Atom™ 处理器设备软件支持团队后,他致力于多项横向项目,包括开发 Android 示例媒体应用、Windows* 8 媒体框架的系统优化以及媒体应用编写文档。
Chris Kirkpatrick 是 Intel 软件与服务集团视觉与交互计算工程团队的一名软件应用工程师,负责支持 Intel 图形解决方案。他拥有俄勒冈州立大学计算机科学学士学位。