笔者: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设计团队提供英特尔图形解决方式开发支持。他拥有俄勒冈州立大学计算机科学理学士学位。

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

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

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

    作者:Mark Liu 下载样本代码 简单介绍 在Android 中,创建一个可以播放视频剪辑的应用很easy:创建一个採用 3D 图形平面的游戏应用也很easy.可是,创建一个可以在 3D 图形对象 ...

  2. 工控图表控件ProEssentials创建3D柱状图示例代码

    使用ProEssentials可以创建3D柱状图,柱状图的形式包括线框.实体和阴影. 类似于Graph control,3D柱状图只需要YData. Subsets定义沿z轴有多少行,Points定义 ...

  3. 基于DotNetOpenAuth的OAuth实现示例代码: 获取access token

    1. 场景 根据OAuth 2.0规范,该场景发生于下面的流程图中的(D)(E)节点,根据已经得到的authorization code获取access token. 2. 实现环境 DotNetOp ...

  4. Android视录视频示例

    这几天需要搞一个Android视频通话功能,从最简单的视频录制开始,网上例子大多不完整.下面的示例参考过别人的代码,还是拿出来给需要的朋友分享下. Activity类:VideoActivity pa ...

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

    基本过程是android作为socket客户端将采集到的每一帧图像数据发送出去,PC作为服务器接收并显示每一帧图像实现远程监控.图片如下(后来PC端加了个拍照功能)... (PS.刚学android和 ...

  6. AspNetCore 基于流下载文件与示例代码

    昨天说了,AspNetCore如何进行上传文件,其中写了两种方式ajax与模型,其文章地址为:https://www.cnblogs.com/ZaraNet/p/9949167.html 那么既然有上 ...

  7. 【毕业设计】基于Android的家校互动平台开发(内含完整代码和所有文档)——爱吖校推(你关注的,我们才推)

    ☆ 写在前面 之前答应大家的毕业答辩之后把所有文档贡献出来,现在答辩已过,LZ信守承诺,把所有文档开源到了GitHub(这个地址包含所有的代码和文档以及PPT,外层为简单的代码).还望喜欢的朋友们,不 ...

  8. EasyNVR网页H5无插件播放摄像机视频功能二次开发之直播通道接口保活示例代码

    背景需求 随着雪亮工程.明厨亮灶.手机看店.智慧幼儿园监控等行业开始将传统的安防摄像头进行互联网.微信直播,我们知道摄像头直播的春天了.将安防摄像头或NVR上的视频流转成互联网直播常用的RTMP.HT ...

  9. 如何基于 ZEGO SDK 实现 Android 一对一音视频聊天应用

    疫情期间,很多线下活动转为线上举行,实时音视频的需求剧增,在视频会议,在线教育,电商购物等众多场景成了"生活新常态". 本文将教你如何通过即构ZEGO sdk在Android端搭建 ...

随机推荐

  1. android json 解析 简单示例

    1 下面是一个简单的json 解析的demo,废话不多说,直接上代码 package com.sky.gallery; import java.io.ByteArrayOutputStream; im ...

  2. OleContainer操作Excel以二进制方式读写数据库

    需求源头:OleContainer操作Excel,想把Excel以二进制方式存入数据库,并且以二进制方式读取存入流:Procedure SaveToStream(ADOTable1: TAdoTabl ...

  3. ESP8266学习笔记1:怎样在安信可全功能測试板上实现ESP-01的编译下载和调试

    近期调试用到了安信可的ESP-01模块,最终打通了编译下载调试的整个通道,有一些细节须要记录,方便兴许的开发工作. 转载请注明:http://blog.csdn.net/sadshen/article ...

  4. Virtualbox mouse move in and out and file share with windows

    How to use Virstalbox to share files with Linux and Windows, and to move the mouse in and out Virtua ...

  5. Android中关于JNI 的学习(六)JNI中注冊方法的实现

    在前面的样例中,我们会发现,当在Java类中定义一个方法的时候,例如以下: public class ParamTransferTest { public static int testval = 1 ...

  6. hbase基本概念和hbase shell经常使用命令使用方法

    HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实现,它利用H ...

  7. RVDS 3.1 下载地址及破解方法

    RealView Development Suite 3.1  RVDS 3.1下载地址:https://silver.arm.com/download/Development_Tools/RVDS/ ...

  8. poj 1198 hdu 1401 搜索+剪枝 Solitaire

    写到一半才发现能够用双向搜索4层来写,但已经不愿意改了,干脆暴搜+剪枝水过去算了. 想到一个非常水的剪枝,h函数为  当前点到终点4个点的最短距离加起来除以2.由于最多一步走2格,然后在HDU上T了, ...

  9. HighChart学习-更新数据data Series与重绘

    一:HighChart介绍 基于JQuery的纯JavaScript的图标库,支持各种图表显示,同时还支持Mootools 与Prototype详细版本支持在这里: JQuery 1.3.2 - 1. ...

  10. Net分布式系统

    Net分布式系统 Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用 摘要: 上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡, ...