实现VR视频的播放和前面写过的VR全景图的展示差不多,改变的也只是库文件的不同,资源目录下的资源不同而已。下面就来说一下步骤。

先展示一下效果图
完成步骤:
1.以导入Moudle的方式导入库文件。(videowidget,common,commonwidget)资源获取链接:https://github.com/googlevr/gvr-android-sdk/
2.在main下新建资产目录asstes,放入视频资源
3.在清单文件application中提高警报权限android:largeHeap=”true”
4.在Moudlede的 build.grable文件里dependencies中添加
compile ‘com.google.android.exoplayer:exoplayer:r1.5.10’
compile ‘com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7’
5.关联导入的依赖库
6完成xml中的布局,video.VrVideoView,AppCompatSeekBar,TextView
7.使用异步任务AsyncTask,(或EventBus技术)加载视频
8.利用线程进行VR优化。
9.设置VR的监听效果

具体方法:
1.以导入Moudle的方式导入库文件

2.添加资产目录。在main新建asstes目录,将VR资源放入

3在清单文件下的application添加 android:largeHeap=”true”的属下节点

4.在Module的build.gradle文件里dependencie中加入
compile ‘com.google.android.exoplayer:exoplayer:r1.5.10’
compile ‘com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7’
获取方式:在你下载的VR资源文件路径下(xxxx\gvr-android-sdk-master\samples\sdk-simplevideowidget)build.gradle文件中拷取。

5.关联你的库文件:ctrl+alt+shift+s在打开的对话框中,选择你原本的项目Moudle,选择Dependencise,点击右上角”+”,选择第三个Module dependency,在打开的对话框中,选择之前导入的库文件。

6.xml中的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.zhiyuan3g.vrvideo.MainActivity"><com.google.vr.sdk.widgets.video.VrVideoViewandroid:layout_width="match_parent"android:layout_height="250dp"android:id="@+id/vr_video"></com.google.vr.sdk.widgets.video.VrVideoView><android.support.v7.widget.AppCompatSeekBarandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/seek_bar"/><TextViewandroid:id="@+id/tv_progress"android:textSize="20dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
</LinearLayout>

7、8,9步中所有的代码都在这了
MainActivity中的代码:

这里写代码片import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;import com.google.vr.sdk.widgets.common.VrWidgetView;
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 vr_video;private SeekBar seek_bar;// 进度条private TextView tv_progress;private VideoLoadTask mVideoLoadTask;// 异步任务@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// A初始化控件vr_video = (VrVideoView) findViewById(R.id.vr_video);seek_bar = (SeekBar) findViewById(R.id.seek_bar);tv_progress = (TextView) findViewById(R.id.tv_progress);// 隐藏VR效果左下角信息按钮显示vr_video.setInfoButtonEnabled(false);// 切换VR模式 参数:VrVideoView.DisplayMode.FULLSCREEN_STEREO:设备模式(手机横着放试试)//                 VrVideoView.DisplayMode..FULLSCREEN_MONO手机模式vr_video.setDisplayMode(VrVideoView.DisplayMode.FULLSCREEN_STEREO);//  对VR视频进行事件监听vr_video.setEventListener(new MyEventListener() );// 播放VR效果,只需要执行异步任务即可mVideoLoadTask = new VideoLoadTask();mVideoLoadTask.execute("congo_2048.mp4");}// B 由于VR资源数据量很大,获取需要时间,故把加载视频放到子线程中进行,主线程来显示,可以使用异步任务AsyncTask,或EventBus技术// 自定义一个类继承AsyncTask,只使用我们需要的方法,完成在子线程加载视频资源,在主线程显示private class  VideoLoadTask extends AsyncTask<String,Void,Void>{// B该方法在子线程运行,从本地文件中把资源加载到内存中@Overrideprotected Void doInBackground(String... params) {// 创建VrVideoView.Options对象,决定VR是普通的效果,还是立体效果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 {//提示:视频加载的方法还做了把视频读取到内存中的操作,所以它会有一个矛盾,调用该方法是在主线程还是在子线程(一般我们放在子线程去调用该方法)// 使用VR控件对象,从资产目录加载视频数据,显示效果, 参数1。params对象,2.VrVideoView.Options对象,决定显示的效果vr_video.loadVideoFromAsset(params[0],options);} catch (IOException e) {e.printStackTrace();}return null;}}// C因为VR很占用内存,所以当界面进入OnPause状态,暂停VR视图显示,// 进入OnResume状态,继续VR视图显示,进入OnDestroy状态,杀死VR// 当我们失去焦点,回调@Overrideprotected void onPause() {super.onPause();// 暂停渲染和显示vr_video.pauseRendering();}// 当获取焦点时,回调@Overrideprotected void onResume() {super.onResume();vr_video.resumeRendering();}// 当Activity销毁时,回调@Overrideprotected void onDestroy() {super.onDestroy();vr_video.shutdown();// 在退出Activity时,如果异步任务没有取消,则取消if (mVideoLoadTask!=null){if (!mVideoLoadTask.isCancelled()){mVideoLoadTask.cancel(true);}}}// 对VR运行状态监听类,自定义一个类,继承VrVideoEventListener,复写里面需要的方法private class MyEventListener extends VrVideoEventListener{// 当VR视频加载成功的时候回调  什么是回调:当你的程序到达符合某个条件时,// 自动调用某段代码或执行某个方法@Overridepublic void onLoadSuccess() {super.onLoadSuccess();// 获取视频长度long max = vr_video.getDuration();// 设置seekbar的进度最大值seek_bar.setMax((int)max);}// 当VR视图加载失败的时候 回调@Overridepublic void onLoadError(String errorMessage) {super.onLoadError(errorMessage);Toast.makeText(MainActivity.this, "播放失败", Toast.LENGTH_SHORT).show();}// 当视频开始播放,每次进入下一帧的时候,回调这个方法(就是播放时,会不停的回调该方法)@Overridepublic void onNewFrame() {super.onNewFrame();// 获取当前视频的播放时间位置int currentPosition = (int) vr_video.getCurrentPosition();// 设置seekVar的进度条seek_bar.setProgress(currentPosition);// 显示播放的进度数字tv_progress.setText("播放进度:"+String.format("%.2f",currentPosition/1000.f)+String.format("%.2f",vr_video.getDuration()/1000f));}// 当视频播放结束后的回到方法@Overridepublic void onCompletion() {super.onCompletion();// 让视频回到0点vr_video.seekTo(0);// 让视频停止vr_video.pauseVideo();// 同时让进度条回到0点seek_bar.setProgress(0);// 播放完成后,重新设置标签true,暂停播放isPaused = true;}// 设置一个视频播放状态的标签private boolean isPaused = false;// 重写点击视图的方法,使视频被点击时播放或者暂停@Overridepublic void onClick() {super.onClick();Log.d("jzs","点击");// 根据标签判断当前视频的状态,标签false,播放则暂停,标签true,暂停播放// true代表视频正处于暂停状态if (isPaused){// 视频播放vr_video.playVideo();}else{// false代表视频正在播放的状态vr_video.pauseVideo();}// 对标签操做一次后,进行取反isPaused = !isPaused;}}
}

共勉!!!!!

通过Android实现VR视频的播放相关推荐

  1. android边直播边录制视频软件,实现Android本机 视频录制播放 边录边放

    [实例简介]实现Android本机 视频录制播放 边录边放 [实例截图] [核心代码] package yzriver.avc.avccodec; import android.app.Activit ...

  2. android实现本地视频的播放,类似于一个小型的MP4,可以选择本地的文件进行播放

    首先呢我们来 看一下布局文件中的代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayou ...

  3. android 微信小视频无法播放器,安卓video组件无法播放视频

    - 当前 Bug 的表现(可附上截图) 使用上述代码片段,在任何iPhone机器上都可以正常播放视频,但是在几乎所有测试过的安卓机器上却无法播放视频,具体表现为加载图标不停转动,但永远无法加载出来. ...

  4. android瀑布流视频自动播放,jquery实现的网页自动播放声音

    jquery实现的网页自动播放声音 复制代码 代码如下: $(function(){ //这里参考了以下两个站点的介绍 //http://www.w3school.com.cn/html/html_a ...

  5. 基于FFmpeg和Android的音视频同步播放实现

    https://blog.csdn.net/ericbar/article/details/80785764 https://blog.csdn.net/AndroidAlvin/article/de ...

  6. Android VR Player(全景视频播放器) [10]: VR全景视频渲染播放的实现(exoplayer,glsurfaceview,opengl es)

    前言 此博客的大部分内容来自我的毕业设计论文,因此语言上会偏正式一点,如果您有任何问题或建议,欢迎留言.在此感谢实验室的聂师兄,全景视频render部分的代码设计主要参考了他所编写的代码来完成,他对视 ...

  7. android的视频直播,Android进行视频,直播播放

    写在前面 忙忙碌碌一个多月没怎么写过文章了,今天来写写Android中的视频,直播播放,斗猫项目里用到直播流,坑踩了不少,可算是填上了.以下代码已上传至:https://github.com/Xxxx ...

  8. html全景直播播放器,HTML5:网页如何播放VR视频?

    VR视频和普通视频有什么区别? VR即虚拟现实,VR视频又名全景视频,是指使用全景摄像机拍摄的,观看时可以自由变换视角的视频. 戴上VR眼镜,随着头部转动看到的图像也随之变化,仿佛身处一个虚拟的世界中 ...

  9. 全景vr视频是什么播放原理?怎么制作vr视频

    近年来,vr开始进入生活,有更多的用户对vr的需求越来越大,而随着5G时代的来临,全景vr视频的形式必定也会越来越普及,体验感也会越来越真实,全景视频可以称为vr视频或360度视频,让我们的视野不再局 ...

最新文章

  1. 解决request中文乱码问题
  2. Python爬虫数据分析三剑客:Numpy、pandas、Matplotlib
  3. MFC获得主窗口和父窗口指针
  4. 异常处理python要求输入的为英文_python(异常处理)
  5. php 中间表示语言,[转载]php 底层 探究之php编译过程及中间语言 opcode
  6. 【OpenCV】图像金字塔详解及编程实现
  7. Ashmem、MemoryFile、Binder的共享内存(jni可用)
  8. 《Java从小白到大牛》之第13章 抽象类与接口
  9. ceph_OSD的添加删除
  10. matlab方差 anov,方差分析
  11. qt 获取用户缩放,Qt-如何创建随窗口缩放并保持纵横比的图像?
  12. 固态硬盘量产工具_固态硬盘测速工具CDM更新8.0版,但我们不推荐你使用
  13. 《正念领导力》承诺14:创造共赢
  14. php union用法,php编程SQL语句union all的使用编程
  15. 关于符号Symbol第一篇
  16. springboot快速搭建ftpserver服务端
  17. 2021-04-29【已解决】The server cannot or will not process the request due to something that is perceived
  18. keep跑步数据修改器_卖轻食、造手环,Keep你变了
  19. Scratch(五十一):端午节抛粽子
  20. Git下载代码--git clone命令

热门文章

  1. Linux里面的文件目录类指令
  2. 计算机图形学第三版徐长青,计算机图形学课后题答案-徐长青、许志闻
  3. 一加新机来袭,你准备好迎接一台“性能小怪兽”了吗?
  4. 佐藤雏量子计算机进展,你与我成神之日,亦或是世界的终结(佐藤雏成神阳太,纯爱)...
  5. 数组作为函数参数时,最好将数组大小也作为一个函数参数
  6. vs2010里面 新建网站里面的 asp.net网站 和 新建项目里面的 asp.net Web应用程序 的区别(上)
  7. 再订购点计划(Reorder Point Planning)概览
  8. 删除重复的数据(完全一致的重复)
  9. 支付宝支付——当面付
  10. python面向对象【头歌】