产品概述
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中)。
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();
}
}
更多内容请关注个人微信公众帐号:极客峰