基于 Android 的 3D 视频示例代码

笔者:Mark
Liu

下载样本代码

简单介绍

Android 中,创建一个可以播放视频剪辑的应用很easy;创建一个採用
3D 图形平面的游戏应用也很easy。可是,创建一个可以在 3D 图形对象上播放视频的应用却不easy。

本文介绍了我为应对该挑战创建的应用。

该应用可在 3D 平面上渲染视频,并支持用户以交互的方式在视频平面上播放。

该应用须要解决三大实施问题:

  1. 怎样构建代码以支持用户在播放视频时变更 3D 平面?
  2. 尽管 Android 中默认的 MediaPlayer 配备了全面的播放操作,可是难以获得视频图像数据并以定制的方式对其进行渲染。

  3. 怎样设计图形组件以运行视频数据渲染?

此外,该应用还面临设备功能的挑战,由于它须要视频和图形对象同一时候执行。本文将对该款应用的特性和使用进行介绍。然后对其设计进行简要的介绍。

特性

该应用具备下面特性:

  1. 它支持用户从其本地媒体库中选择视频剪辑。
  2. 该应用支持横向和纵向两种方向;当方向转换时,视频可以持续播放。
  3. 它可提供三种播放模式:
    1. 默认模式:这是常规播放模式。视频剪辑如同在常规媒体播放器中一样播放。
    2. 随机旋转:视频的平面可随横向和纵向随机旋转;其颜色也可在红色色调和正常颜色之间切换。

    3. 触摸旋转:用户能够使用触摸功能向左、右滑动并旋转平面,详细取决于速度。
    4. 当将应用移动至后台或关闭时,可将当前的视频剪辑保存并在应用又一次激活时进行播放。

注:应用中没有视频会话控制;因此用户无法停止、快进或回放视频。假设将应用移动至后台或关闭,视频仅仅能从头開始播放。

使用模式

開始播放视频剪辑

该应用未包括不论什么视频。因此用户能够选择 Android 平台支持的随意视频剪辑进行播放。可是。建议使用採用 H.264AVC 编解码器以 MPEG-4 标准处理的视频编辑。由于我们在开发时是採用这样的格式。应用首次启动时。将会显示文件选择器界面(请见上一页的截图)。

用户选择首选的文件选择器后。系统将会提供屏幕指示。

选择视频剪辑后。将開始播放。

注:有时,视频開始前须要等待一段时间 — 约 5 ~ 10 秒。

选择不同的模式

应用開始播放时是使用常规模式。如要更改模式,用户可点击 UI 上的选项button,启动选项菜单。

选项菜单有四个选项:前三个是播放模式选项。最后一个选项可支持用户选择不同的视频剪辑。

随机旋转

该选择可支持渲染视频的平面随着横、纵轴呈 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) 的软件project师,负责开发基于 Android 设备的验证框架。此外。他还參与英特尔超便携设备事业部的多个其它 Android 项目。包含智能手机和平板电脑设备。

他所做的大部分工作都与媒体播放、视频会议和软件栈性能调优相关。

增加英特尔软件和设备事业部基于英特尔? 凌动? 处理器的设备软件支持团队后,他负责多项不同的任务,包含 Android 样本媒体应用的开发、Windows* 8 媒体框架的系统优化以及用于编写媒体应用的文档。

Chris Kirkpatrick 是英特尔软件与服务事业部的软件project师,负责为视觉与交互式计算project设计团队提供英特尔图形解决方式开发支持。他拥有俄勒冈州立大学计算机科学理学士学位。

分类:


video3d.zip
(115.71 KB)
Download Now

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-14 00:40:30

基于 Android 的 3D 视频示例代码的相关文章

基于 Android 的 3D 视频样本代码

作者:Mark Liu 下载样本代码 简介 在Android 中,创建一个能够播放视频剪辑的应用非常简单:创建一个采用 3D 图形平面的游戏应用也非常简单.但是,创建一个能够在 3D 图形对象上播放视频的应用却不容易.本文介绍了我为应对该挑战创建的应用.该应用可在 3D 平面上渲染视频,并支持用户以交互的方式在视频平面上播放. 该应用需要解决三大实施问题: 如何构建代码以支持用户在播放视频时变更 3D 平面? 虽然 Android 中默认的 MediaPlayer 配备了全面的播放操作,但是难以

基于Android的远程视频监控系统(含源码)

基本过程是android作为socket客户端将采集到的每一帧图像数据发送出去,PC作为服务器接收并显示每一帧图像实现远程监控.图片如下(后来PC端加了个拍照功能)... (PS.刚学android和java不久很多东西还不懂,高手若是知道哪些地方可以继续优化的话还请多多指点下啊) 系统代码如下:一.android手机客户端(1)AndroidManifest.xml文件.添加camera和socket权限,并设置了程序开始执行的activity. <?xml version="1.0&q

基于android的远程视频监控系统(已开放源码)

基本过程是android作为socket客户端将采集到的每一帧图像数据发送出去,PC作为服务器接收并显示每一帧图像实现远程监控.图片如下(后来PC端加了个拍照功能)... (PS.刚学android和java不久很多东西还不懂,高手若是知道哪些地方可以继续优化的话还请多多指点下啊) 系统代码如下: 一.android手机客户端 (1)AndroidManifest.xml文件.添加camera和socket权限,并设置了程序开始执行的activity. <?xml version="1.0

Android自定义控件——3D画廊和图像矩阵

转载请注明出处:http://blog.csdn.net/allen315410/article/details/39932689 1.3D画廊的实现 我们知道android系统已经为我们提供好了一个展示图片的"容器"--Gallery,但是这个Gallery显示的效果是平面化的,动态效果不强.这里,我们动手做一个自定义的Gallery组件,实现图片的3D效果展示,想想应该不错吧,先看看效果图: 实现这个3D效果的Gallery该怎么做呢?首先,分析一下, 1,展示图片,系统自带Gal

Android判断当前网络是否可用--示例代码

Android判断当前网络是否可用--示例代码 分类: *07 Android 2011-05-24 13:46 7814人阅读 评论(4) 收藏 举报 网络androiddialogmanagernetworknull 在Android平台上开发基于网络的应用,必然需要去判断当前的网络连接情况.下面的代码,作为例子,详细说明了对于当前网络情况的判断. 先看一个自己定义的应用类. public class NetworkDetector {           public static boo

微信Android SDK示例代码及运行方法

最近在研究微信SDK,无奈网上好使的教程太少,对于程序员来说最好的东西,一个是微信的开发文档,一个是微信SDK的范例代码.无奈文档小白很难看懂,范例代码又没有详细的解释,导致我折腾了好多天,现在有点眉目了,先记下来. 1.申请应用AppKey 微信的SDK要求应用的包名.签名的MD5.AppID严格对应,所以没有申请的应用是肯定无法使用的.申请了的应用如果这三个对不上,是无法使用的. ·包名,是应用建立时候的名称,你可以在AndroidManifest.xml文件的package项中找到 ·签名

搭建基于MinGW平台的《OpenGL蓝皮书(OpenGL SuperBibe 5th)》示例代码编译环境

副标题:搭建基于MinGW平台的<OpenGL超级宝典>(OpenGL蓝皮书第5版)GLTools 编译环境.示例代码:Triangle.cpp @ SB5.zip 以下内容以及方法均参考自老外在stackoverflow上的回答,强烈建议看看原文,因为他告诉你解决问题的思路而不只是给你结果opengl-superbible-5th-edition-set-up-problems 1. 还未安装MinGW的,去官网下一个,我这里用的是第三方的安装包 TDM-GCC  32位下载地址 2. 到

基于RSA的加密/解密示例C#代码

在C#程序中,大家可能比较熟悉的方式是md5加密解密方式,对RSA可能并不是很熟悉, 下面就说一下RSA加密和解密的算法: using System;using System.Security.Cryptography;using System.Text;class RSACSPSample{    static void Main()    {        try        {            string str_Plain_Text = "How are you?How are

android动画-动画分类及代码示例

原来一直对动画一知半解,只知道按照网上的方法会用就行了,但是自己写起来感觉确实有点费劲,今天终于研究了代码实现,一下子感觉清晰多了.先把总结如下,代码中有详细的注释. 动画分类 1.Peoperty Animation 这个动画是Android3.0之后推出的目前用处不大. 2.View Animation 这类动画也叫tween animation 主要分为 渐变动画(AlphaAnimation)旋转动画(RotateAnimation) 缩放动画(ScaleAnimation)位移动画(T