1、导入谷歌官方提供的库:

  
commonwidget、common、panowidget(全景图)、videowidget(视频)
或者添加依赖:
  
dependencies {
compile project(':libraries-common')
compile project(':libraries-commonwidget')
compile project(':libraries-videowidget')
}

版本要求:
  
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="22" />
2、配置清单文件:
  
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application android:label="SimpleVrPanoramaActivity"
android:largeHeap="true"
android:theme="@android:style/Theme.Holo.Light">
<activity android:name=".SimpleVrVedioActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="com.google.intent.category.CARDBOARD" />
</intent-filter>
</activity>
</application>

3、 布局加载 全景资源(图片)控件
  
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFF000"
android:orientation="vertical">
<com.google.vr.sdk.widgets.video.VrVideoView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="500dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFFFFF"
android:orientation="horizontal">
<SeekBar
android:id="@+id/seek_bar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1" />
<TextView
android:id="@+id/status_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center"
android:padding="8dp"
android:text="00:00" />
</LinearLayout>
</FrameLayout>

4、初始化全景视频
  
private void initVideoView() {
videoView = (VrVideoView) findViewById(R.id.video_view);
    //只能在主线程里面加载资产目录
VrVideoView.Options option = new VrVideoView.Options();
//输入格式
option.inputFormat = VrVideoView.Options.FORMAT_DEFAULT;
//声音模式
option.inputType = VrVideoView.Options.TYPE_MONO;
try {
videoView.loadVideoFromAsset("congo.mp4", option);
// String path= Environment.getExternalStorageDirectory()+"/testRoom1_1080Stereo.mp4";
// String path= Environment.getExternalStorageDirectory()+"/testRoom1_1920Mono.mp4";
// Uri uri= Uri.parse("file:///"+path);
// videoView.loadVideo(uri,option);
isPause=true;
} catch (Exception e) {
e.printStackTrace();
isPause=false;
}
videoView.setEventListener(new VrVideoEventListener() {
@Override
public void onLoadSuccess() {
super.onLoadSuccess();
System.out.println("onLoadSuccess");
}
//点击
@Override
public void onClick() {
super.onClick();
toggle();
}
@Override
public void onLoadError(String errorMessage) {
super.onLoadError(errorMessage);
System.out.println("onLoadError " + errorMessage);
}
@Override
public void onCompletion() {
super.onCompletion();
System.out.println("onCompletion ");
}
@Override
public void onNewFrame() {
super.onNewFrame();
System.out.println("onNewFrame ");
refreshStatusBar();
}
});
}

   
private boolean isPause = false;
private void toggle() {
if (isPause) {
isPause = false;
videoView.playVideo();
} else {
isPause = true;
videoView.pauseVideo();
}
refreshStatusBar();
}

5、初始化SeekBar进度条
  
//初始化拖动控件
private void initSeekBar() {
seekbar = (SeekBar) findViewById(R.id.seek_bar);
seekbar.setMax(100);
seekbar.setProgress(0);
statusText = (TextView) findViewById(R.id.status_text);
//添加事件
seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
System.out.println("onProgressChanged fromUser=" + fromUser);
if (fromUser) {
//指定位置继续播放
videoView.seekTo(progress);
refreshStatusBar();
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
System.out.println("SeekBar onStartTrackingTouch");
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
System.out.println("SeekBar onStopTrackingTouch");
}
});
}

   
private void refreshStatusBar() {
StringBuilder status = new StringBuilder();
status.append(videoView.getCurrentPosition() / 1000f);
status.append(" / ");
status.append(videoView.getDuration() / 1000f);
status.append("s");
statusText.setText(status);
}

6、关联activity
   
@Override
protected void onPause() {
super.onPause();
videoView.pauseRendering();//停止显示
}
@Override
protected void onResume() {
super.onResume();
videoView.resumeRendering();//继续显示
refreshStatusBar();
}
@Override
protected void onDestroy() {
videoView.shutdown();//停止播放
super.onDestroy();
 
}

VR开发基础—VR视频相关推荐

  1. Oculus Quest 2 和 Unity 的 VR 开发基础知识

    使用 Meta 强大的 Quest 2 一体式 VR 耳机学习虚拟现实开发的基础知识 课程英文名:VR Development Fundamentals With Oculus Quest 2 And ...

  2. 【学习记录】第一章 数据库设计-《SQL Server数据库设计和开发基础篇视频课程》...

    一.课程笔记 1.1  软件开发周期 (1)需求分析阶段 分析客户的业务和数据处理需求. (2)概要设计阶段 设计数据库的E-R模型图,确认需求信息的正确和完整. /* E-R图:实体-关系图(Ent ...

  3. VR开发基础(一)一文理清unity xr plugin架构与openxr标准

    一,VR开发中的几个概念:从openVR到openXR 1. OpenVR OpenVR是Valve公司开发的一套包含一系列SDK和API的工具集,旨在从驱动层级为硬件厂商提供软硬件开发支持.硬件设备 ...

  4. Google VR开发-Cardboard VR SDK头部追踪实现(罗德里格旋转公式)

    一.罗德里格旋转公式 可以参考百度百科和维基百科进行了解. 概括来说就是罗德里格旋转公式就是用来求旋转后新向量的公式: 而这个公式可以转换成矩阵形式: 公式各部分的几何意义和推导原理参考下图 这个图证 ...

  5. 【AR\VR开发基础】GLSL初步学习①

    可能看到这很多人就会认为跑偏了,我们明明是来学AR/VR的为啥要搞 GLSL ?这是神马鬼? 其实在图形学中,我们要学的东西很多,就比如说一些专业术语,还有线性代数... 所以今天就带大家先来认识一下 ...

  6. VR开发基础(二)一文详解Oculus环境helloxr的openxr核心接口流程

    注:Oculus使用的是开源的hello_xr示例,但要使用自家的loader:在hello_xr上篇侧重分析了入口和图形的基本流程,此篇将侧重分析XR相关的流程 一,Setup and Build ...

  7. VR开发基础(三)unity XR最简开发环境搭建-整合Interaction toolkit、openXR plugin、PICO与OCULUS

    一,是时候使用openxr了 1,开发阶段,VR设备厂商SDK各异: pico和Oculus是国内外的vr设备代表,各自提供了不同的厂商SDK(unity 插件)进行快速上手,但也可能因此调用了厂商私 ...

  8. 【Unity VR开发基础】Player视角设置调整与地面的相对高度

    [背景] 在上一篇中我介绍了如何在Unity VR项目中设置基本的用户对象,也就是VR Rig,这时运行游戏测试的话,已经可以通过头盔看到游戏世界了,但你会发现有一点奇怪,就是视角非常的低,似乎是贴着 ...

  9. Google VR开发-Cardboard VR SDK反畸变实现

    上一篇文章分析了Cardboard SDK的生命周期设计. 这里我们看下畸变部分的实现. Cardboard中将畸变这部分封装成了一个Distortion类和DistortionRenderer类. ...

最新文章

  1. python int str_python int str
  2. SHOW PROCESSLIST 命令详解 (查看锁表)
  3. Spark性能优化:对RDD持久化或CheckPoint操作
  4. K8S Learning(4)——Namespace
  5. Java中多线程访问冲突的解决方式
  6. linux新增动态库后可执行程序找不到的问题
  7. 试论述计算机辅助教学的特点,浅谈计算机辅助教学特点
  8. Cobbler详解(四)——CentOS7系统导入
  9. Hbase权威指南(含目录,高清,免费)
  10. windows2003事件记录中显示组策略错误,登录域控制器很慢(服务器自身)
  11. Mac版PhotoShop 2020 最新版下载
  12. 解决-win10软件默认安装路径为C盘——修改注册表
  13. most_common()函数源码解读
  14. 在线学习PS设计精讲精练记录(5)
  15. ISO15765协议
  16. python数据分析实战之阿里巴巴股票行情分析
  17. windows下配置公私钥
  18. Python 第几周和星期几
  19. C语言:va_list
  20. Python|实验项目八例

热门文章

  1. 树莓派4B安装Opencv4.5及配置(无脑式操作)
  2. 16QAM调制与解调-MATLAB基带仿真
  3. [从头读历史] 第251节 图解易经(下)
  4. 2016微软技术大会门票在线抢,最后半天!!!
  5. 昨晚,我用python帮学妹P证件照自拍,然后发现。。。
  6. 在飞书上定制 BOT 服务,Chatopera 机器人让办公更智能 | Chatopera
  7. 茶的文化我宣传|茶叶储存
  8. 可视化监控告警-grafana
  9. Xmind:高数第二章:导数与微分 思维导图
  10. 【LaTeX】 案例分析 (9) - MCM 2021 - 目录 / 伪代码 / 分栏 / 文字框 / 组合图 / 表格排版 / 公式编号