在智能手机和平板电脑上开发3D图形界面的游戏应用已经变得相对普遍,但要实现在3D图形对象上播放视频则更具挑战性。本文将介绍一款开发的应用程序,旨在克服这一挑战。该应用能够在3D表面上渲染视频,并允许用户与视频表面进行交互。
为了开发这款应用,需要解决以下三个主要的实现难题:
1. 如何构建代码,以便用户可以在视频播放的同时改变3D表面。
2. 虽然Android平台的默认MediaPlayer具备播放功能,但无法获取视频图像数据并进行自定义渲染。
3. 如何设计图形组件以执行视频数据渲染。
此外,该应用还挑战了设备的能力,因为它要求视频和图形对象同时工作。
这款应用具备以下特点:
1. 用户可以从本地媒体库中选择视频片段。
2. 应用支持垂直和水平布局;当布局改变时,视频可以连续播放。
3. 应用有三种播放模式:
- 默认模式:这是正常的播放模式;视频片段将像普通媒体播放器一样播放。
- 随机旋转:视频表面会随机沿水平和垂直轴旋转;颜色也会在红色调和正常颜色之间切换。
- 触摸旋转:用户可以通过触摸来扫动和旋转表面,改变旋转速度。
4. 当应用被推到后台或关闭时,当前片段可以保存并在应用重新激活时重播。
注意:没有视频会话控制;因此用户不能停止、快进或倒带视频。如果应用被推到后台或停止,视频只能从头开始播放。
开始播放视频片段:
该应用不包括任何视频,因此用户可以选择任何Android平台支持的视频片段。但建议使用H.264AVC编解码器的MPEG-4容器格式的视频片段,因为这是开发过程中测试的格式。当应用首次启动时,文件选择器屏幕将显示。
一旦用户选择了首选的文件选择器,屏幕上会给出方向。选择视频片段后,播放将开始。
注意:有时视频开始播放需要一段时间——大约5到10秒。
应用以正常模式启动。要更改模式,用户点击UI上的选项按钮以启动选项菜单。
选项菜单有四个选择:前三个是播放模式的选项;最后一个选项允许用户选择不同的视频片段。
这个选择会导致渲染视频的表面沿水平和垂直轴随机旋转,并定期在屏幕上投射红色调。
在触摸旋转模式下,用户可以通过向左或向右扫动来让表面沿垂直轴向左或向右旋转。扫动速度越快,旋转加速越快,当用户停止扫动时自然减速。
该应用的三个主要组件是:
1. UI组件,为用户提供应用的交互式展示。
2. 视频组件,进行视频播放。
3.OpenGL*表面,用于渲染视频帧缓冲区,并在特殊模式下创建3D效果。
视频播放组件有两个线程。视频引擎线程使用MediaCodec类。这个类是在Android JellyBean版本(API 16)中引入的。它暴露了Android媒体框架的低级API,以便可以在帧级别控制播放。在每个视频帧上,图形组件可以持有图像数据并改变图像的渲染方式。
播放组件还实现了一个音频引擎线程,播放视频片段的音轨。为了同步视频和音频线程,以便角色的嘴唇与他们说话时的声音匹配,实现了AV同步算法。视频播放总是将其时间戳与音频时间戳进行比较。它将调整播放速度,以便视频帧永远不会超过30毫秒的时间限制。
图形组件扩展了GLSurfaceView,以便在类中嵌入自定义渲染类。渲染类实现了Renderer接口以执行OpenGL渲染算法。算法实现了纹理表面的3D旋转效果,并根据用户输入改变模式到不同的算法。
在渲染中,通过简单的顶点和像素着色器处理视频帧的旋转和着色。视频平面的旋转是通过应用一系列欧拉角旋转来执行的。帧的着色是通过在像素着色器内将视频帧内容与固定颜色(本例中为红色)进行线性混合来实现的。
图形组件还作为视频引擎的视频帧监听器,并在构建期间传递给MediaCodec对象,以便每次有帧可用时调用渲染函数。图形组件在UI组件中有一个功能,以便用户可以更改播放模式。
MediaCodec解码过程以视频帧的速度工作,图形组件中的渲染函数以图形帧的速度工作。因此,当访问帧缓冲区时,两个组件中的函数必须同步。
- 将OpenGL*游戏移植到基于Intel Atom处理器的Android*
- Android* MediaPlayer示例代码解析,基于Intel架构
- 在Intel处理器图形上进行3D游戏
- Intel Android*开发者区域
要了解更多关于Intel工具的信息,请访问Intel®开发者区域,适用于Android。
Mark Liu在Intel超移动小组担任软件工程师,负责在基于Android的设备上开发验证框架。他还参与了Intel超移动小组的几个Android项目,包括智能手机和平板电脑设备。这些工作大多与媒体播放、视频会议和软件堆栈性能调整有关。