Google VR 使用详解

    xiaoxiao2021-04-12  32

    VR全景图片显示(本地)

    1.搭建VR图片开发的环境

    1.1.导入从github搜索下载的google vr sdk 里面的引用库 common,commonwidget,panowidget(全景图片控件库)1.2.当前这三个库里面缺少序列相关的api,容易引用类找不到,未定义异常1.3.依赖三个库 //出现类未定义错误的缺少库 compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7' compile project(':common') compile project(':commonwidget') compile project(':panowidget') 1.4.准备全景图片用来测试代码 放在assets目录下面,例assets/a.jpg1.5.对当前应用进行内存设置,希望应用可使用最大内存 避免OOM <application android:largeHeap="true"

    2.加载全景图片到内存中成为Bitmap(bitmap是图片在内存中的表示对象),展示在全景图片控件

    public class MainActivity extends AppCompatActivity { private VrPanoramaView vrPanoramaView; private ImageTask imageTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //步骤二。加载全景图片到内存中成为Bitmap(bitmap是图片在内存中的表示对象),展示在全景图片控件 //2.1.布局全景图片控件 //2.2.查找控件 vrPanoramaView = (VrPanoramaView) findViewById(R.id.vr_pano); //2.3.因为图片比较大,希望在异步线程里面加载,防止占用主线程 imageTask = new ImageTask(); imageTask.execute("a.jpg"); } private class ImageTask extends AsyncTask<String,Void,Bitmap> { //2.4.读取资产目录下面的a.jpg图片 @Override protected Bitmap doInBackground(String... params) { try { //2.4.1.获取文件流 InputStream inputStream = getAssets().open(params[0]); //2.4.2.使用BitmapFactory可以将inputStream,file,byte[]-->Bitmap Bitmap bitmap = BitmapFactory.decodeStream(inputStream); return bitmap; } catch (IOException e) { e.printStackTrace(); } return null; } //2.5.在主线程展示位图 @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); if(bitmap!=null) { //加载bitmap到vr图片控件 参1.Bitmap VrPanoramaView.Options options=new VrPanoramaView.Options() ; //TYPE_STEREO_OVER_UNDER :立体图片:上半画面显示在左眼,下半画面显示在右眼 //TYPE_MONO :普通图片 options.inputType= VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER; //3.1.监听加载过程 VrPanoramaEventListener listener=new VrPanoramaEventListener(){ //3.1.1.加载bitmap异常 @Override public void onLoadError(String errorMessage) { super.onLoadError(errorMessage); Toast.makeText(MainActivity.this, errorMessage, Toast.LENGTH_SHORT).show(); } //3.1.2.加载bitmap成功 @Override public void onLoadSuccess() { super.onLoadSuccess(); Toast.makeText(MainActivity.this, "进入VR图片显示...", Toast.LENGTH_SHORT).show(); } }; vrPanoramaView.setEventListener(listener); vrPanoramaView.loadImageFromBitmap(bitmap,options); } } }

    3.处理全景控件展示细节

    //步骤三。处理全景控件展示细节 //3.2.页面停到后台,暂停画面显示 @Override protected void onPause() { super.onPause(); if (vrPanoramaView != null) { vrPanoramaView.pauseRendering(); } } //3.3.页面回到屏幕,再继续显示 @Override protected void onResume() { super.onResume(); if (vrPanoramaView != null) { vrPanoramaView.resumeRendering(); } //3.5.按钮控制 //3.5.1隐藏info按钮 vrPanoramaView.setInfoButtonEnabled(false); //3.5.2隐藏全屏按钮 vrPanoramaView.setFullscreenButtonEnabled(false); //3.5.3.展示全屏 //FULLSCREEN_MONO 全屏模式 //FULLSCREEN_STEREO CardBoard 纸盒 vrPanoramaView.setDisplayMode(VrWidgetView.DisplayMode.FULLSCREEN_STEREO); } //3.4.页面关闭,销毁图片 @Override protected void onDestroy() { super.onDestroy(); if (vrPanoramaView != null) { vrPanoramaView.shutdown(); } if (imageTask != null && !imageTask.isCancelled()) { //防止页面退出AsyncTask引用的异常 imageTask.cancel(true); imageTask = null; } } }

    全景视频显示

    1.搭建全景视频的开发环境

    1.1.导入github搜索google vr sdk 的开发库 common,commonwidget,videowidget1.2.依赖 当前三个库缺少的api // 出现类未定义错误的缺少库 compile 'com.google.android.exoplayer:exoplayer:r1.5.10' compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7' compile project(':common') compile project(':commonwidget') compile project(':videowidget') 1.3.准备全景视频来测试程序 ,放到assets下面 例 assets/b.mp41.4. 设置应用的内存选项,在内存不足时可以使用最大内存. <application android:largeHeap="true"

    2.在线程加载全景视频,显示在全景视频控件上

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.vr.sdk.widgets.video.VrVideoView android:layout_width="match_parent" android:id="@+id/vr_video_view" android:layout_height="match_parent"> </com.google.vr.sdk.widgets.video.VrVideoView> <LinearLayout android:layout_width="match_parent" android:orientation="vertical" android:layout_height="wrap_content"> <SeekBar android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/seekbar" /> <TextView android:background="#AEAEAE" android:textColor="#FFFFFF" android:text="00/100s" android:layout_width="wrap_content" android:gravity="center" android:layout_height="wrap_content" android:id="@+id/time" /> </LinearLayout> <ProgressBar android:layout_centerInParent="true" android:layout_width="wrap_content" android:id="@+id/loading" android:layout_height="wrap_content" /> </RelativeLayout> public class MainActivity extends AppCompatActivity { private VrVideoView vrVideoView; private VideoTask videoTask; private ProgressBar progressBar; private TextView timeView; private SeekBar seekBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //步骤二。在线程加载全景视频,显示在全景视频控件上 //2.1.布局控件并查找 vrVideoView = (VrVideoView) findViewById(R.id.vr_video_view); //2.2 创建子线程加载资源 videoTask = new VideoTask(); //2.3.传入文件名 videoTask.execute("b.mp4"); seekBar = (SeekBar) findViewById(R.id.seekbar); timeView = (TextView) findViewById(R.id.time); progressBar = (ProgressBar) findViewById(R.id.loading); } private class VideoTask extends AsyncTask<String, Void, Void> { @Override protected Void doInBackground(String... params) { //2.4.从资产目录加载全景视频(类似ProgressBar因为这种控件可以自己处理线程) VrVideoView.Options options = new VrVideoView.Options();//设置参数 //立体视频:上半画面显示在左眼,下半画面显示在右眼 //普通视频: options.inputType = VrVideoView.Options.TYPE_MONO; //FORMAT_DEFAULT:资源 sd assets //FORMAT_HLS :流媒体 直播 options.inputFormat = VrVideoView.Options.FORMAT_DEFAULT; //步骤四:监听加载过程 播放过程 省略 try{ vrVideoView.loadVideoFromAsset(params[0], options); } catch (Exception e) { e.printStackTrace(); } return null; } } }

    3.根据用户的操作来调整显示(性能优化,防止黑屏)

    //步骤三。根据用户的操作来调整显示(性能优化,防止黑屏) //3.1.页面 退到后台 暂停显示 @Override protected void onPause() { super.onPause(); if (vrVideoView != null) { vrVideoView.pauseRendering(); } } //3.2.页面 回到屏幕 打开显示 @Override protected void onResume() { super.onResume(); if (vrVideoView != null) { vrVideoView.resumeRendering(); } } //3.3.页面 退出页面 销毁 @Override protected void onDestroy() { super.onDestroy(); if (vrVideoView != null) { vrVideoView.shutdown(); } if (videoTask != null && !videoTask.isCancelled()) { videoTask.cancel(true); videoTask = null; } }

    4.监听加载过程 播放过程

    //步骤四:监听加载过程 播放过程 VrVideoEventListener listener = new VrVideoEventListener() { //4.1.加载成功 处理加载成的显示 @Override public void onLoadSuccess() { super.onLoadSuccess(); progressBar.setVisibility(View.GONE); } //4.2.加载失败 @Override public void onLoadError(String errorMessage) { super.onLoadError(errorMessage); progressBar.setVisibility(View.GONE); Toast.makeText(MainActivity.this, errorMessage, Toast.LENGTH_SHORT).show(); } //4.3.播放中 onNewFrame执行一次,代表视频播了一个画面 @Override public void onNewFrame() { super.onNewFrame(); //更新seekbar seekBar.setMax((int) vrVideoView.getDuration()); seekBar.setProgress((int) vrVideoView.getCurrentPosition()); //更新时间 23.323232323 String curr = String.format("%.2f", vrVideoView.getCurrentPosition() / 1000f); String total = String.format("%.2f", vrVideoView.getDuration() / 1000f); timeView.setText(curr + "/" + total + "s"); } //4.4.播放完成 @Override public void onCompletion() { super.onCompletion(); //设置播放位置 vrVideoView.seekTo(0); //暂停播放 vrVideoView.pauseVideo(); isPasuse = true; Toast.makeText(MainActivity.this, "播放完成,是否重播", Toast.LENGTH_SHORT).show(); } private boolean isPasuse = false; //4.5.操作:点击继续播放 @Override public void onClick() { super.onClick(); if (isPasuse) { vrVideoView.playVideo(); isPasuse = false; } else { vrVideoView.pauseVideo(); isPasuse = true; } } }; try { vrVideoView.setEventListener(listener);

    5.界面设置

    在onCreate

    //步骤五。界面设置 //5.1.设置隐藏info vrVideoView.setInfoButtonEnabled(false); //5.2.设置隐藏全屏 vrVideoView.setFullscreenButtonEnabled(false); //5.3.显示全屏 //FULLSCREEN_MONO全屏模式 //FULLSCREEN_STEREO双眼模式 vrVideoView.setDisplayMode(VrWidgetView.DisplayMode.EMBEDDED);

    全景图片与视频(网络)

    1.要求获取网络图片

    2.4.1.获取网络流是差别

    //步骤二。加载全景图片到内存中成为Bitmap(bitmap是图片在内存中的表示对象),展示在全景图片控件 //2.1.布局全景图片控件 //2.2.查找控件 vrPanoramaView = new VrPanoramaView(this); setContentView(vrPanoramaView); //2.3.因为图片比较大,希望在异步线程里面加载,防止占用主线程 imageTask = new ImageTask(); imageTask.execute(item.url); } private class ImageTask extends AsyncTask<String,Void,Bitmap> { //2.4.读取资产目录下面的a.jpg图片 @Override protected Bitmap doInBackground(String... params) { try { //2.4.1.获取网络流 URL url=new URL(params[0]); HttpURLConnection connection= (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(10000); InputStream inputStream =connection.getInputStream(); //2.4.2.使用BitmapFactory可以将inputStream,file,byte[]-->Bitmap Bitmap bitmap = BitmapFactory.decodeStream(inputStream); return bitmap; } catch (IOException e) { e.printStackTrace(); } return null; } //2.5.在主线程展示位图 @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); if(bitmap!=null) { //加载bitmap到vr图片控件 参1.Bitmap VrPanoramaView.Options options=new VrPanoramaView.Options() ; //TYPE_STEREO_OVER_UNDER :立体图片:上半画面显示在左眼,下半画面显示在右眼 //TYPE_MONO :普通图片 options.inputType= VrPanoramaView.Options.TYPE_MONO; //3.1.监听加载过程 VrPanoramaEventListener listener=new VrPanoramaEventListener(){ //3.1.1.加载bitmap异常 @Override public void onLoadError(String errorMessage) { super.onLoadError(errorMessage); Toast.makeText(VrImagePlayActivity.this, errorMessage, Toast.LENGTH_SHORT).show(); } //3.1.2.加载bitmap成功 @Override public void onLoadSuccess() { super.onLoadSuccess(); Toast.makeText(VrImagePlayActivity.this, "进入VR图片显示...", Toast.LENGTH_SHORT).show(); } }; vrPanoramaView.setEventListener(listener); vrPanoramaView.loadImageFromBitmap(bitmap,options); } } }

    2.全景的网络视频

    private class VideoTask extends AsyncTask<String, Void, Void> { @Override protected Void doInBackground(String... params) { //2.4.从资产目录加载全景视频(类似ProgressBar因为这种控件可以自己处理线程) VrVideoView.Options options = new VrVideoView.Options();//设置参数 //立体视频:上半画面显示在左眼,下半画面显示在右眼 //普通视频: options.inputType = VrVideoView.Options.TYPE_MONO; //FORMAT_DEFAULT:资源 sd assets //FORMAT_HLS :流媒体 直播 options.inputFormat = VrVideoView.Options.FORMAT_DEFAULT; //步骤四:监听加载过程 播放过程 VrVideoEventListener listener = new VrVideoEventListener() { //4.1.加载成功 处理加载成的显示 @Override public void onLoadSuccess() { super.onLoadSuccess(); progressBar.setVisibility(View.GONE); } //4.2.加载失败 @Override public void onLoadError(String errorMessage) { super.onLoadError(errorMessage); progressBar.setVisibility(View.GONE); Toast.makeText(VrVideoPlayActivity.this, errorMessage, Toast.LENGTH_SHORT).show(); } //4.3.播放中 onNewFrame执行一次,代表视频播了一个画面 @Override public void onNewFrame() { super.onNewFrame(); //更新seekbar seekBar.setMax((int) vrVideoView.getDuration()); seekBar.setProgress((int) vrVideoView.getCurrentPosition()); //更新时间 23.323232323 String curr = String.format("%.2f", vrVideoView.getCurrentPosition() / 1000f); String total = String.format("%.2f", vrVideoView.getDuration() / 1000f); timeView.setText(curr + "/" + total + "s"); } //4.4.播放完成 @Override public void onCompletion() { super.onCompletion(); //设置播放位置 vrVideoView.seekTo(0); //暂停播放 vrVideoView.pauseVideo(); isPasuse = true; Toast.makeText(VrVideoPlayActivity.this, "播放完成,是否重播", Toast.LENGTH_SHORT).show(); } private boolean isPasuse = false; //4.5.操作:点击继续播放 @Override public void onClick() { super.onClick(); if (isPasuse) { vrVideoView.playVideo(); isPasuse = false; } else { vrVideoView.pauseVideo(); isPasuse = true; } } }; try { vrVideoView.setEventListener(listener); //加载网络视图 1.参数url 2.options vrVideoView.loadVideo(Uri.parse(params[0]),options); } catch (Exception e) { e.printStackTrace(); } return null; } } //加载网络视图 1.参数url 2.options vrVideoView.loadVideo(Uri.parse(params[0]),options);

    3.注意网络问题

    3.1.权限

    <!--联网--> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    3.2.手机联网 3.3.服务器开启

    转载请注明原文地址: https://ju.6miu.com/read-667176.html

    最新回复(0)