Android开发VR实战之播放360度全景视频
发布时间 - 2026-01-10 22:12:00 点击率:次VR即Virtual Reality虚拟现实。虚拟现实技术是一种可以创建和体验虚拟世界的计算机*系统它利用计算机生成一种模拟环境是一种多源信息融合的交互式的三维动态视景和实体行为的系统*使用户沉浸到该环境中。
那么,如何在Android中去开发VR功能的APP呢?我们利用谷歌提供的开源SDK去实现一个360°全景视频的功能
一.在build.gradle中引入谷歌VR的SDK依赖
compile 'com.google.vr:sdk-videowidget:1.10.0'
二.注意支持的最小SDK
minSdkVersion 19
targetSdkVersion 25
三.界面布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="cn.bluemobi.dylan.vrdevelopvideo.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Android开发VR360度全景视频" /> <com.google.vr.sdk.widgets.video.VrVideoView android:id="@+id/vr_video_view" android:layout_width="match_parent" android:layout_height="250dp"></com.google.vr.sdk.widgets.video.VrVideoView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageButton android:id="@+id/play_toggle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@android:color/transparent" android:paddingStart="0dp" android:src="@drawable/pause" /> <SeekBar android:id="@+id/seek_bar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="0dp" android:layout_height="32dp" android:layout_weight="8" /> <ImageButton android:id="@+id/volume_toggle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@android:color/transparent" android:paddingStart="0dp" android:paddingTop="4dp" android:src="@drawable/volume_on" /> </LinearLayout> </LinearLayout>
四.加载360°全景视频
/**
* 加载360度全景视频
*/
private void load360Video() {
vr_video_view = (VrVideoView) findViewById(R.id.vr_video_view);
seek_bar = (SeekBar) findViewById(R.id.seek_bar);
volume_toggle = (ImageButton) findViewById(R.id.volume_toggle);
play_toggle = (ImageButton) findViewById(R.id.play_toggle);
/**设置加载设置**/
VrVideoView.Options options = new VrVideoView.Options();
options.inputType = VrVideoView.Options.TYPE_STEREO_OVER_UNDER;
/**
* 设置加载监听
*/
vr_video_view.setEventListener(new VrVideoEventListener() {
/**
* 视频播放完成回调
*/
@Override
public void onCompletion() {
super.onCompletion();
/**播放完成后跳转到开始重新播放**/
vr_video_view.seekTo(0);
setIsPlay(false);
Log.d(TAG, "onCompletion()");
}
/**
* 加载每一帧视频的回调
*/
@Override
public void onNewFrame() {
super.onNewFrame();
seek_bar.setProgress((int) vr_video_view.getCurrentPosition());
Log.d(TAG, "onNewFrame()");
}
/**
* 点击VR视频回调
*/
@Override
public void onClick() {
super.onClick();
Log.d(TAG, "onClick()");
}
/**
* 加载VR视频失败回调
* @param errorMessage
*/
@Override
public void onLoadError(String errorMessage) {
super.onLoadError(errorMessage);
Log.d(TAG, "onLoadError()->errorMessage=" + errorMessage);
}
/**
* 加载VR视频成功回调
*/
@Override
public void onLoadSuccess() {
super.onLoadSuccess();
/**加载成功后设置回调**/
seek_bar.setMax((int) vr_video_view.getDuration());
Log.d(TAG, "onNewFrame()");
}
/**
* 显示模式改变回调
* 1.默认
* 2.全屏模式
* 3.VR观看模式,即横屏分屏模式
* @param newDisplayMode 模式
*/
@Override
public void onDisplayModeChanged(int newDisplayMode) {
super.onDisplayModeChanged(newDisplayMode);
Log.d(TAG, "onLoadError()->newDisplayMode=" + newDisplayMode);
}
});
try {
/**加载VR视频**/
vr_video_view.loadVideoFromAsset("congo.mp4", options);
} catch (IOException e) {
e.printStackTrace();
}
/**设置声音按钮点击监听**/
volume_toggle.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
setIsMuted(!isMuted);
}
});
/**设置播放暂停按钮点击监听**/
play_toggle.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
setIsPlay(!isPlay);
}
});
/**设置进度条拖动监听**/
seek_bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
/**
* 进度条拖动改变监听
* @param seekBar 拖动条
* @param progress 进度
* @param fromUser 是否是用户手动操作的
*/
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
/**调节视频进度**/
vr_video_view.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
/**
* 设置声音开关
*
* @param isMuted 开关
*/
private void setIsMuted(boolean isMuted) {
this.isMuted = isMuted;
volume_toggle.setImageResource(isMuted ? R.drawable.volume_off : R.drawable.volume_on);
vr_video_view.setVolume(isMuted ? 0.0f : 1.0f);
}
/**
* 设置播放暂停
*
* @param isPlay 播放暂停
*/
private void setIsPlay(boolean isPlay) {
this.isPlay = isPlay;
play_toggle.setImageResource(isPlay ?R.drawable.pause: R.drawable.play );
if(isPlay){
vr_video_view.playVideo();
}else{
vr_video_view.pauseVideo();
}
}
五.GitHub
https://github.com/linglongxin24/VRDevelopVideo
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# VR
# 360度全景视频
# Android提高之MediaPlayer播放网络视频的实现方法
# Android使用VideoView播放本地视频和网络视频的方法
# 一个html5播放视频的video控件只支持android的默认格式mp4和3gp
# 详解Android App中使用VideoView来实现视频播放的方法
# android webvie指定视频播放器播放网站视频
# Android提高之MediaPlayer音视频播放
# android使用videoview播放视频
# Android播放assets文件里视频文件相关问题分析
# Android播放视频的三种方式
# Android仿新浪微博/QQ空间滑动自动播放视频功能
# Android DragVideo实现播放视频时任意拖拽的方法
# Android编程实现播放视频的方法示例
# 加载
# 回调
# 拖动
# 是一种
# 进度条
# 中去
# 全屏
# 开源
# 大家多多
# 到该
# 跳转到
# 视频播放
# 完成后
# 如何在
# schemas
# apk
# res
# http
# activity_vertical_margin
# paddingLeft
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Linux后台任务运行方法_nohup与&使用技巧【技巧】
java获取注册ip实例
如何自定义建站之星网站的导航菜单样式?
如何在局域网内绑定自建网站域名?
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
如何用西部建站助手快速创建专业网站?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
如何破解联通资金短缺导致的基站建设难题?
如何在Windows环境下新建FTP站点并设置权限?
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
桂林网站制作公司有哪些,桂林马拉松怎么报名?
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
Laravel用户密码怎么加密_Laravel Hash门面使用教程
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
Laravel如何实现多对多模型关联?(Eloquent教程)
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
使用spring连接及操作mongodb3.0实例
如何为不同团队 ID 动态生成多个独立按钮
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
如何用搬瓦工VPS快速搭建个人网站?
Linux安全能力提升路径_长期防护思维说明【指导】
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
Angular 表单中正确绑定输入值以确保提交与验证正常工作
使用Dockerfile构建java web环境
Laravel如何使用Sanctum进行API认证?(SPA实战)
北京专业网站制作设计师招聘,北京白云观官方网站?
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
微信小程序 wx.uploadFile无法上传解决办法
Python面向对象测试方法_mock解析【教程】
百度浏览器如何管理插件 百度浏览器插件管理方法
Laravel如何为API生成Swagger或OpenAPI文档
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧

