作者:Mark Liu
在 Android 中,创建一个能够播放视频剪辑的应用非常简单;创建一个采用 3D 图形平面的游戏应用也非常简单。但是,创建一个能够在 3D 图形对象上播放视频的应用却不容易。本文介绍了我为应对该挑战创建的应用。该应用可在 3D 平面上渲染视频,并支持用户以交互的方式在视频平面上播放。
该应用需要解决三大实施问题:
此外,该应用还面临设备功能的挑战,因为它需要视频和图形对象同时运行。本文将对该款应用的特性和使用进行介绍,然后对其设计进行简要的介绍。
该应用具备以下特性:
注:应用中没有视频会话控制;因此用户无法停止、快进或回放视频。如果将应用移动至后台或关闭,视频只能从头开始播放。
该应用未包含任何视频,因此用户可以选择 Android 平台支持的任意视频剪辑进行播放。但是,建议使用采用 H.264AVC 编解码器以 MPEG-4 标准处理的视频编辑,因为我们在开发时是采用这种格式。应用首次启动时,将会显示文件选择器界面(请见上一页的截图)。
用户选择首选的文件选择器后,系统将会提供屏幕指示。选择视频剪辑后,将开始播放。
注:有时,视频开始前需要等待一段时间 — 约 5 ~ 10 秒。
应用开始播放时是使用常规模式。如要更改模式,用户可点击 UI 上的选项按钮,启动选项菜单。
选项菜单有四个选项:前三个是播放模式选项;最后一个选项可支持用户选择不同的视频剪辑。
该选择可支持渲染视频的平面随着横、纵轴呈 3D 效果随机旋转。此外,它还可定期在屏幕上呈现红色色调。
在触摸旋转模式中,用户可以向左、右滑动,从而让平面沿着纵轴左、右旋转。当滑动更快时,旋转将会加快;当用户停止滑动时,旋转将会随之减速。
该应用中的三个主要组件包括:为用户提供交互式应用演示的 UI 组件;进行视频播放的视频组件;渲染视频帧缓冲区并在特殊模式下创建 3D 效果的OpenGL* 平面。
该视频播放组件有两个线程。视频引擎线程使用MediaCodec 类。该类在 Android JellyBean 版本(API 16)中推出。它可以提供低级别的 Android 媒体框架 API,因此您可以在帧层面控制播放。在每个视频帧上,图形组件可以控制图像数据,并更改渲染图像的方式。
此外,播放组件还可执行播放视频剪辑音轨的音频引擎线程。为使视频和音频线程同步,从而让人物的口型与其说出的声音相匹配,我们实施了 AV 同步算法。视频播放可使其时间戳与音频时间戳时刻保持一致。它可以对播放速度进行微调,以便将视频帧控制在 30 毫秒的时间范围内。
图形组件可添加一个 GLSurfaceView,从而在该类中嵌入一个定制的渲染类。渲染类可实施渲染器接口来执行 OpenGL 渲染算法。该算法可在纹理平面上实施 3D 旋转效果,还可根据用户的输入将模式更改为其他算法。
在渲染器中,对视频帧旋转和着色是通过一个简单的顶点和像素着色器来控制的。视频平面的旋转通过应用一系列的欧拉角旋转来实现。帧的着色通过将视频帧内容与固定颜色(在本案例中为红色)在像素着色器中进行线性混合来实现。
此外,图形组件还可用作视频引擎的视频帧监听器,并可在实施过程中传送至 MediaCodec 对象,这样每当有可用帧时便可调用渲染功能。图形组件可在 UI 组件中提供一个选项,这样用户便能够更改播放模式。
MediaCodec 编解码流程与视频帧保持同步,图形组件中的渲染器功能与图形帧保持同步。因此,当访问帧缓冲区时,两个组件中的功能必须保持同步。
相关链接与资源:
如要了解更多为 Android 开发人员提供的英特尔工具,请访问:。
Mark Liu 是英特尔超便携设备事业部 (Intel Ultra-Mobile Group) 的软件工程师,负责开发基于 Android 设备的验证框架。此外,他还参与英特尔超便携设备事业部的多个其他 Android 项目,包括智能手机和平板电脑设备。他所做的大部分工作都与媒体播放、视频会议和软件栈性能调优相关。
加入英特尔软件和设备事业部基于英特尔? 凌动? 处理器的设备软件支持团队后,他负责多项不同的任务,包括 Android 样本媒体应用的开发、Windows* 8 媒体框架的系统优化以及用于编写媒体应用的文档。
Chris Kirkpatrick 是英特尔软件与服务事业部的软件工程师,负责为视觉与交互式计算工程设计团队提供英特尔图形解决方案开发支持。他拥有俄勒冈州立大学计算机科学理学士学位。
基于 Android 的 3D 视频样本代码,布布扣,bubuko.com
原文地址:http://blog.csdn.net/x86android/article/details/26447951