所需要的VR运行库可在https://github.com/googlevr/gvr-android-sdk/下载
新建项目后:
1. 在项目main文件夹下新建资产目录 assets并把视频放入该文件下:
tips:文件夹命名必须是assets,否者会出现空指针错误。
2. 以module的形式导入VR项目依赖的library库,分别是必要的库common,commonwidge,和可选择的,例如 videowidgt(视频)。
3.快捷键(ctrl+shift+alt+s),实现module相关连
4.在项目里的build.gradle文件里添加:
compile
'com.google.android.exoplayer:exoplayer:r1.5.10'
compile
'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7
5.在AnroidManifest.xml文件下添加:
android
:largeHeap=
"true"
防止资源过大,出现out of memory错误。
6. 完成xml布局,VrPanoramaView。
7. 由于Vr资源量大,所以加载到子线程中进行主线程来显示图片。使用一个异步线程AsyncTask或EventBus技术进行
全部代码如下:
package com.zhiyuan3g.administrator.vr_video;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import com.google.vr.sdk.widgets.video.VrVideoEventListener;
import com.google.vr.sdk.widgets.video.VrVideoView;
import java.io.IOException;
public class MainActivity
extends AppCompatActivity {
private VrVideoView
vrp;
private SeekBar
seekbar;
private TextView
tv;
private Myload
myload;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.
activity_main);
//
初始化
initView();
}
private void initView() {
vrp = (VrVideoView) findViewById(R.id.
vr_video);
tv = (TextView) findViewById(R.id.
tv_ar);
seekbar = (SeekBar) findViewById(R.id.
seekbar);
//
隐藏
VR
信息按钮显示
vrp.setInfoButtonEnabled(
false);
//
切换
VR
模式 参数:
FULLSCREEN_STEREO
设备模式
FULLSCREEN_MONO
手机模式
vrp.setDisplayMode(VrVideoView.DisplayMode.
FULLSCREEN_STEREO);
//
视频监听
vrp.setEventListener(
new Mylisitener());
//
播放
VR
效果
myload =
new Myload();
myload.execute(
"congo_2048.mp4");
}
//vr
资源数据量很大,获取需要时间,顾把加载时间放在子线程,主线程显示视频,可使用
AsyncTask
或
Eventbar
private class Myload
extends AsyncTask<String, Void, Void> {
//
该方法在子线程中运行,从本地文件把资源加载到内存中
@Override
protected Void doInBackground(String... params) {
//
创建
VrVideoView.Options
对象,决定是普通效果还是立体效果
VrVideoView.Options options =
new VrVideoView.Options();
options.
inputType = VrVideoView.Options.
TYPE_STEREO_OVER_UNDER;
//
处理加载视频格式
// FORMAT_DEFAULT
默认格式(
sd
卡或
assets
)
// FORMAT_HLS
流媒体格式
options.
inputFormat = VrVideoView.Options.
FORMAT_DEFAULT;
//
提示:视屏加载还做了视频读取到内存中的操作,所以有一个矛盾
try {
//
提示
:
视频加载的方法还做了把视频读取到内存中的操作
,
所以它会有一个矛盾
,
//
调用该方法是在主线程还是在子线程
(
一般我们放在子线程去调用该方法
)
vrp.loadVideoFromAsset(params[
0], options);
//
使用
vr
控件对象。从
assets
加载视频显示效果。参数
1
:
String
对象,
2VrVideoView.Options
:显示效果
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
//
优化方法
@Override
protected void onPause() {
//
暂停渲染和显示
vrp.pauseRendering();
super.onPause();
}
@Override
protected void onResume() {
//
继续渲染和显示
vrp.resumeRendering();
super.onResume();
}
//
当
Activity
销毁时,回调
@Override
protected void onDestroy() {
vrp.shutdown();
if (
myload !=
null) {
//
退出时,异步任务未取消
if (!
myload.isCancelled()) {
myload.cancel(
true);
}
}
super.onDestroy();
}
//
自定义类对
vr
运行状态监听
private class Mylisitener
extends VrVideoEventListener {
//Vr
视频加载成功,回调
@Override
public void onLoadSuccess() {
//
获取视频长度
long duration =
vrp.getDuration();
//
设置
seekbar
进度最大值
seekbar.setMax((
int) duration);
super.onLoadSuccess();
}
//
视频加载失败回调
@Override
public void onLoadError(String errorMessage) {
Toast.
makeText(MainActivity.
this,
"
播放失败
", Toast.
LENGTH_LONG).show();
super.onLoadError(errorMessage);
}
//
当视频开始播放,每进入下一正,回调
@Override
public void onNewFrame() {
super.onNewFrame();
//
获取当前视频的播放时间位置
int currentPosition = (
int)
vrp.getCurrentPosition();
//
设置
seekBar
的进度条
seekbar.setProgress(currentPosition);
//
显示播放的进度数字
tv.setText(
"
播放进度
:" + String.
format(
"%.2f", currentPosition /
1000.f) + String.
format(
"%.2f",
vrp.getDuration() /
1000f));
}
@Override
public void onCompletion() {
//
视频回到
0
点
vrp.seekTo(
0);
//
视频停止
vrp.pauseVideo();
//
进度条回到原点
seekbar.setProgress(
0);
//
播放结束后,重新设置标签,暂停播放
ispause =
true;
super.onCompletion();
}
//
设置一个视频播放的标签
private boolean
ispause =
false;
//
重写点击视频方法
@Override
public void onClick() {
//
根据标签,判断 当前视频状态
if (
ispause) {
vrp.playVideo();
}
else {
vrp.pauseVideo();
}
super.onClick();
//
对标签操作一次后,要进行取反
ispause = !
ispause;
}
}
}
转载请注明原文地址: https://ju.6miu.com/read-13963.html