文档章节

Android使用得图SDK开发VR播放器

feng_blog
 feng_blog
发布于 2016/05/23 14:32
字数 1371
阅读 1021
收藏 1

产品概述

Android SDK包含全景图片、VR视频、漫游主题等多种展示方式,支持小行星模式、陀螺仪、VR双屏沉浸式观看。文件下载、解码都在播放器中完成,您只需一个链接地址或是一条配置即可展现炫酷的全景效果。

注: 该SDK支持不低于4.0.0的Android版本(api14)。

下载并集成SDK

下载SDK最新版

下载最新版panoplay_android_jar SDK,解压SDK压缩包,将panoplay_android_jar文件夹中的'libs'和'res/raw'文件夹复制到你的项目工程根目录下(如使用'ADT 17'以下用户需要手动添加'libs'下的jar文件到工程Path中)。

sdk包下载

demo下载

AndroidManifest配置

增加权限

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

配置最低可运行版本

  <uses-sdk

        android:minSdkVersion="14"

        android:targetSdkVersion="21"   />

在manifest根节点配置OpenGL版本: <uses-feature android:glEsVersion="0x00020000" android:required="true"/>

为了达到最好的播放效果建议开启硬件加速:在Application节点中声明android:hardwareAccelerated="true"

初始化配置

由于本播放器使用universal-image-loader类库来管理图片,因此首先要在Application中初始化ImageLoader,若在您的项目中已使用到了该类库,只需保证 DisplayImageOptions 中bitmapConfig为Bitmap.Config.ARGB_8888类型,imageScaleType为ImageScaleType.NONE,并且开启了内存和磁盘缓存。 没有配置过的可以按以下方式配置:

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()

    .imageScaleType(ImageScaleType.NONE)

    .cacheInMemory(true)

    .cacheOnDisk(true)

    .build();

ImageLoaderConfiguration config = new ImageLoaderConfiguration

    .Builder(this)

    .defaultDisplayImageOptions(defaultOptions)

    .threadPriority(Thread.NORM_PRIORITY - 2)

    .denyCacheImageMultipleSizesInMemory()

    .discCacheFileNameGenerator(new Md5FileNameGenerator())

    .tasksProcessingOrder(QueueProcessingType.FIFO)

    .build();

ImageLoader.getInstance().init(config);

播放器引入

布局文件引用

播放器需要借助com.player.renderer.PanoPlayerSurfaceView(继承自android.opengl.GLSurfaceView)类来播放全景图片和视频,您可以根据需要自定义他的宽高和位置,还可以再继承自 PanoPlayerSurfaceView 根据需求自定义点击事件和滑动事件。

函数调用

创建播放渲染器:

播放器需要借助 com.player.panoplayer.PanoPlayer(PanoPlayerSurfaceView view, Context context)来控制OpenGL渲染。 首先获取布局文件播放器:

PanoPlayerSurfaceView ppsview;

创建渲染器并和播放器绑定:

PanoPlayer renderer=new PanoPlayer(ppsview, this);

ppsvVideo.setRenderer(renderer);

创建播放文件链接:

创建播放链接类PanoPlayerUrl加载文件 PanoPlayerUrl panoplayerurl = new PanoPlayerUrl();

加载视频或图像

加载视频或图像有三种方法:

1) 通过网络地址直接加载

加载视频方法: panoplayerurl.SetVideoUrlImage("视频地址","");

加载六面图方法: panoplayerurl.SetCubeUrlImage("六面图地址","六面图的预览图") 其中六面图的地址输入格式为:http://fwpano813.img.detuyun.cn/143461522655827dbad040a/oper/59gv8ty1gte1p9l2_html_%s.jpg 后面以%s结尾; 访问时可把%s换成f(/u/b/l/r/d);

加载2:1全景图方法: panoplayerurl.SetSphereUrlImage("2:1图的地址","");

2) 通过加载Xml文件: panoplayerurl. setXmlUrl("xml文件")

3) 通过构造xml加载:如构造一个鱼眼视频的xml

String T = 

"<DetuVr>

    <settings init=\"pano1\" initmode=\"default\"  "+"enablevr=\"false\" title=\"\" />      <scenes>

        <scene name=\"pano1\" title=\"\"  "+ "thumburl=\"\">

        <preview url=\"%s\" type=\"CUBESTRIP\"></preview>

        <image type=\"%s\" "+ "url=\"%s\" degree=\"%d\" device=\"%d\"/>

        </scene>

    </scenes>

</DetuVr>";

初始化XML配置

 String xmlstring = String.format(T,"","video", "需要加载的地址", 240,1);

   //[type=video,degree =240(鱼眼度数),device=1(鱼眼设备类型)]

加载xml

panoplayerurl.setXmlContent(xmlstring);

开始播放

renderer.Play(panoplayerurl);

注: 可使用的文件路径规则:

"http://site.com/image.png" // from Web

"file:///mnt/sdcard/image.png" // from SD card

"assets://image.png" // from assets

"drawable://" + R.drawable.img // from drawables

播放回调函数调用

播放图片回调:

在播放图片时可通过IPanoPlayerListener接口绑定播放事件:

renderer.setListener(IPanoPlayerListener listener);

播放视频回调:

在播放视频时需同时绑定IPanoPlayerListener和IPanoPlayerVideoPluginListener接口才可获取到完整的播放事件:

renderer.setListener(IPanoPlayerListener listener);

renderer.setVideoPluginListener(IPanoPlayerVideoPluginListener listener);

播放回调说明:

回调接口

包含回调

回调说明

IPanoPlayerListener

void PanoPlayOnLoading()

播放器数据正在加载中

 

void PanoPlayOnLoaded()

播放器数据加载完成

 

void PanoPlayOnEnter(PanoramaData var1)

播放器场景加载完成

 

void PanoPlayOnLeave(PanoramaData var1);

播放器场景已移除

 

void PanoPlayOnError(PanoPlayerErrorCode var1)

播放出错

IPanoPlayerVideoPluginListener

void PluginVideoOnInit()

播放器数据初始化完成

 

void PluginVideoOnStatusChanged(PanoVideoPluginStatus status)

播放状态变化

 

void PluginVideoOnProgressChanged(int curTime, int bufTime, int maxTime)

播放进度变化。其中curTime为当前播放的位置;bufTime为缓冲位置;maxTime为视频总长度

 

void PluginVideoOnSeekFinished()

视频进度拖动完成

 

void PluginVideOnPlayerError(PanoPlayerErrorStatus var1, String var2)

播放出错

模式切换

在播放图片和视频时还可进行模式切换,有两种方式: 直接切换和渐变切换,您可根据需要选择其中一种。

直接切换:renderer.setViewMode(ViewMode mode);

渐变切换 : prenderer.setAnimationViewMode(ViewMode mode);

模式说明

模式

说明

ViewMode.VIEWMODE_FISHEYE

鱼眼模式

ViewMode.VIEWMODE_LITTLEPLANET

小行星模式

ViewMode.VIEWMODE_DEF

默认模式

ViewMode.VIEWMODE_PLANE

平面模式

ViewMode.VIEWMODE_VR

VR 模式

其他设置

设置陀螺仪开关

可调用renderer.setGyroEnable(boolean enable);来设置播放器是否使用陀螺仪:enable 为true 时,陀螺仪可用;为false 时,陀螺仪不可用。

视频播放进度控制

在视频播放过程中还可进行视频播放控制。在public void PluginVideoOnInit()函数中获取播放器插件控制器:

@Override

    public void PluginVideoOnInit() {

        Plugin plugin = renderer.getCurPlugin();

        if (plugin instanceof VideoPlugin) {

            videoplugin = (VideoPlugin) plugin;

            //设置播放器日志级别

            //videoplugin.setLogLevel(IjkMediaPlayer.IJK_LOG_VERBOSE);

        }

    }

从某一时刻开始播放:

videoplugin.seekTo(int progress);

获取播放缓冲百分比:

int buffr = videoplugin.getreadBufferingPercent();

暂停播放:

videoplugin.pause();

开始播放:

videoplugin.start();

重新播放:

videoplugin.replayer();

注意事项

为了更好的管理播放器资源引用,您需在您的onDestroy() 方法手动销毁播放器,释放播放资源。

    @Override

    protected void onDestroy() {

        super.onDestroy();

        if (renderer != null) {

            renderer.release();

        }

    }

 

        更多内容请关注个人微信公众帐号:极客峰        

© 著作权归作者所有

共有 人打赏支持
feng_blog

feng_blog

粉丝 117
博文 128
码字总数 100196
作品 2
朝阳
iOS工程师
【AR】在Unity中开始使用Vuforia(1)

原 目录 在Unity中开始使用Vuforia Vuforia在统一 关于Vuforia 安装Vuforia 创建一个新的Unity项目 Vuforia游戏对象 在您的项目中激活Vuforia 访问Unity中的Vuforia功能 将目标添加到您的场景...

lichong951
06/11
0
0
《视频直播技术详解》系列之一:视频采集和处理

直播中的各个环节: 1.采集 采集是播放环节中的第一环,iOS 系统因为软硬件种类不多,硬件适配性较好,所以比较简单。Android 则不同,市面上硬件机型非常多,难以做到一个库适配所有硬件。P...

ljianbing
06/26
0
0
Android源码50例汇总,欢迎各位下载

下载中心好资料很多,藏在各个角落,小弟在此帮大家做了一个整理,做了一个下载目录,方便大家选择性下载。 源码实例如下: 《Android应用开发揭秘》源代码推荐 http://down.51cto.com/data...

程序袁_绪龙
2015/01/23
0
0
Android应用内实现视频播放--腾讯浏览服务(TBS)

TBS视频播放 TBS视频播放器可以支持市面上几乎所有的视频格式,包括mp4, flv, avi, 3gp, webm, ts, ogv, m3u8, asf, wmv, rm, rmvb, mov, mkv等18种视频格式。同时支持硬件解码,使得内存占用...

ChaoYoung
07/30
0
0
小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载三(通过实例来体验生命周

4.1.2 通过实例来亲身体验Activity的生命周期 上一小节介绍了Activity生命周期中的各个过程,本小节将以一个简单的实例来使读者亲身体验到Activity生命周期中的各个事件。 在Eclipse中新建一...

woiwoi
2014/10/29
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

高三暑假我是怎么想开去学linux系统的

高三的时候,我有一句口头禅:“老了老了,现在做题越来越迟钝了”。当时整天日夜苦读,体重日益增加,脸色越来越黯淡,我在终于熬过了高考的时候,简直心里面乐得开了花。我终于可以去做自己...

linuxprobe16
9分钟前
0
0
Python 获得命令行参数的方法

需要模块:sys 参数个数:len(sys.argv) 脚本名: sys.argv[0] 参数1: sys.argv[1] 参数2: sys.argv[2]

编程老陆
16分钟前
0
0
链队

队列用链表来表示时,需要用两个变量来记录队列两端的变化:theFront,theBack. 根据链接方向的不同,链队有两种链接方式(其实就是链表的头插入节点和尾插入节点,头删除节点和尾删除节点)。...

Frost729
20分钟前
0
0
IDEA toString() json模板

public java.lang.String toString() {java.lang.StringBuilder builder = new java.lang.StringBuilder();#set ($i = 0)#foreach ($member in $members)#if ($i == 0)builder.appen......

Mtok
30分钟前
0
0
Dubbo内核实现之SPI简单介绍

Dubbo采用微内核+插件体系,使得设计优雅,扩展性强。那所谓的微内核+插件体系是如何实现的呢!即我们定义了服务接口标准,让厂商去实现(如果不了解spi的请谷歌百度下), jdk通过ServiceLo...

明理萝
35分钟前
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部