新技术VR—开发详细讲解

这里写图片描述

简单 介绍

每天都能看到关于VR的新闻,但是在日常生活中,关于VR的相关却并不多见,虽说今年是VR爆发的元年,然而对普通消费者来说却毫无知觉,VR似乎离我们这么近,又那么的远。

目前VR设备主要分为三大类:VR头盔、VR一体机、VR盒子(类别名称还没有统一叫法)。

目前VR内容的平台虽然不多,但也足够体验用,而且资源也算丰富和全面。下面推荐的内容平台均为APP应用,基本大部分都支持iOS和安卓端使用,比较热门的有:UtoVR、3D%E6%92%AD%E6%92%AD/’ target=’_blank’>3D播播、暴风魔镜、橙子VR、VR热播等(具体见下截图)。
这里写图片描述

VR开发基础—全景图

这里写图片描述

搭建VR图片开发的环境

导入从github搜索下载的 google vr sdk (点击查看) 里面的引用库
1、导入谷歌官方提供的库:

这里写图片描述

commo
commonwidget
panowidget(全景图)
videowidget(全景视频)

这里写图片描述

2、出现类未定义错误的缺少库


compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
compile project(':common')
compile project(':commonwidget')
compile project(':panowidget')

3、准备全景图片用来测试代码 放在assets目录下面,例assets/a.jpg
4、对当前应用进行内存设置,希望应用可使用最大内存 避免OOM

<application android:largeHeap="true"

例如:

 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"

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

布局全景图片控件

<?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"
    tools:context="com.itheima.a001vrpanodemo.MainActivity">


    <com.google.vr.sdk.widgets.pano.VrPanoramaView
        android:id="@+id/vr_pano"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></com.google.vr.sdk.widgets.pano.VrPanoramaView>
</RelativeLayout>

查找控件

 vrPanoramaView = (VrPanoramaView) findViewById(R.id.vr_pano);

因为图片比较大,希望在异步线程里面加载,防止占用主线程

imageTask = new ImageTask();
imageTask.execute("a.jpg");
private class ImageTask extends AsyncTask<String,Void,Bitmap>
    {
       //读取资产目录下面的a.jpg图片
        @Override
        protected Bitmap doInBackground(String... params) {
            try {
                //获取文件流
                InputStream inputStream = getAssets().open(params[0]);
                //使用BitmapFactory可以将inputStream,file,byte[]-->Bitmap
                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                return bitmap;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        //在主线程展示位图
        @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;
               //监听加载过程
                VrPanoramaEventListener listener=new VrPanoramaEventListener(){
                    //加载bitmap异常
                    @Override
                    public void onLoadError(String errorMessage) {
                        super.onLoadError(errorMessage);
                        Toast.makeText(MainActivity.this, errorMessage, Toast.LENGTH_SHORT).show();
                    }
                    //加载bitmap成功
                    @Override
                    public void onLoadSuccess() {
                        super.onLoadSuccess();
                        Toast.makeText(MainActivity.this, "进入VR图片显示...", Toast.LENGTH_SHORT).show();
                    }
                };
                vrPanoramaView.setEventListener(listener);
                vrPanoramaView.loadImageFromBitmap(bitmap,options);
            }
        }
    }

处理全景控件展示细节

 //页面停到后台,暂停画面显示
    @Override
    protected void onPause() {
        super.onPause();
        if (vrPanoramaView != null) {
            vrPanoramaView.pauseRendering();
        }
    }

 //页面回到屏幕,再继续显示
    @Override
    protected void onResume() {
        super.onResume();
        if (vrPanoramaView != null) {
            vrPanoramaView.resumeRendering();
        }

        //按钮控制
//隐藏info按钮
        vrPanoramaView.setInfoButtonEnabled(false);

//隐藏全屏按钮
        vrPanoramaView.setFullscreenButtonEnabled(false);

        //展示全屏
        //FULLSCREEN_MONO 全屏模式
        //FULLSCREEN_STEREO CardBoard 纸盒
        vrPanoramaView.setDisplayMode(VrWidgetView.DisplayMode.FULLSCREEN_STEREO);
    }

    //页面关闭,销毁图片
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (vrPanoramaView != null) {
            vrPanoramaView.shutdown();
        }
        if (imageTask != null && !imageTask.isCancelled()) {
            //防止页面退出AsyncTask引用的异常
            imageTask.cancel(true);
            imageTask = null;
        }
    }

完整代码Demo1

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);
        //步骤一。搭建VR图片开发的环境
        //1.1.导入从github搜索下载的google vr sdk 里面的引用库 common,commonwidget,panowidget(全景图片控件库)
        //1.2.当前这三个库里面缺少序列相关的api,容易引用类找不到,未定义异常
        //1.3.依赖三个库
        //1.4.准备全景图片用来测试代码 放在assets目录下面,例assets/a.jpg
        //1.5.对当前应用进行内存设置,希望应用可使用最大内存 避免OOM  <application android:largeHeap="true"
        //步骤二。加载全景图片到内存中成为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.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;
        }
    }
}

全景视频展示

这里写图片描述

搭建全景视频开发环境

导入github搜索google vr sdk 的开发库 common,commonwidget,videowidget

导入API跟全景图片一样,特别是开发全景视频就导入videowidget(全景视频)、如果是开发全景图片就导入panowidget(全景图),根据开发的需要。

依赖 当前三个库缺少的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')

准备全景视频来测试程序 ,放到assets下面 例 assets/b.mp4
设置应用的内存选项,在内存不足时可以使用最大内存.

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

界面布局

<?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:id="@+id/vr_video_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        </com.google.vr.sdk.widgets.video.VrVideoView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <SeekBar
            android:id="@+id/seekbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#AEAEAE"
            android:gravity="center"
            android:text="00/100s"
            android:textColor="#FFFFFF" />
    </LinearLayout>

    <ProgressBar
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />
</RelativeLayout>

布局控件并查找

vrVideoView = (VrVideoView) findViewById(R.id.vr_video_view);

seekBar = (SeekBar) findViewById(R.id.seekbar);
timeView = (TextView) findViewById(R.id.time);
progressBar = (ProgressBar) findViewById(R.id.loading);

创建子线程加载资源

  videoTask = new VideoTask();
  videoTask.execute("b.mp4");
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(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);
                //vrVideoView.loadVideoFromAsset(params[0], options);
                vrVideoView.loadVideo(Uri.parse(params[0]),options);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }

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

 //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;
        }
    }

界面设置

在onCreate

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

完整代码Demo2

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);
        //步骤一。搭建全景视频的开发环境
        //1.1.导入github搜索google vr sdk 的开发库 common,commonwidget,videowidget
        //1.2.依赖 当前三个库缺少的api
        //1.3.准备全景视频来测试程序 ,放到assets下面 例 assets/b.mp4
        //1.4. 设置应用的内存选项,在内存不足时可以使用最大内存. <application  android:largeHeap="true"
        //步骤二。在线程加载全景视频,显示在全景视频控件上
        //2.1.布局控件并查找
        vrVideoView = (VrVideoView) findViewById(R.id.vr_video_view);
        //2.2 创建子线程加载资源
        videoTask = new VideoTask();
        //2.3.传入文件名
//        videoTask.execute("b.mp4");
        videoTask.execute("http://youkesvideo.oss-cn-hangzhou.aliyuncs.com/movie2/2016/10/11/%E6%B9%84%E5%85%AC%E6%B2%B3%E8%A1%8C%E5%8A%A8.Operation.Mekong.2016.TC720P.X264.AAC.Mandarin.CHS.Mp4Ba.mp4");

        seekBar = (SeekBar) findViewById(R.id.seekbar);
        timeView = (TextView) findViewById(R.id.time);
        progressBar = (ProgressBar) findViewById(R.id.loading);

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

    }

    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(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);
                //vrVideoView.loadVideoFromAsset(params[0], options);
                vrVideoView.loadVideo(Uri.parse(params[0]),options);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    //步骤三。根据用户的操作来调整显示(性能优化,防止黑屏)
    //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;
        }
    }
}

获取网络资源的全景图片和全景视频

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(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);
                //vrVideoView.loadVideoFromAsset(params[0], 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.注意网络问题

权限

<!--联网-->
<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"/>

手机联网
服务器开启

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值