【iOS】VR实践--GVR的简单使用
VR是个比较火的话题,在iOS中集成全景和VR播放功能,是非常值得考虑和去实践的。最近公司也准备在APP中集成VR功能。所以我也就了解了下VR功能的开发。目前有一些能帮助我们快速实现VR的项目,其中Google提供的GVRSDK(Google VR SDK)就是非常好的代表,基于此,我们可以快速地实现一个性能不错的全景和VR播放器。(图片全景播放+视频全景播放)
废话不多说,直接撸代码
一、SDK的导入
GVRSDK的导入也是很简单的,我们可以通过cocoapods导入。
target 'VRDemo' do
# Comment the next line if you don't want to use dynamic frameworks # Pods for VRDemo
pod 'GVRSDK' target 'VRDemoTests' do
inherit! :search_paths
# Pods for testing
end target 'VRDemoUITests' do
# Pods for testing
end end
导入成功后就是这样的结果了。

二、全景图的加载展示
GVRSDK提供全景图片播放的类是GVRPanoramaView,它支持两个load接口。
/**
* Load a 360-Panorama image from @c UIImage of type ::kGVRPanoramaImageTypeMono.
*
* If image is nil, it clears the view.
*/
- (void)loadImage:(UIImage *)image; /**
* Load a 360-Panorama image from @c UIImage of type ::GVRPanoramaImageType.
*
* If image is nil, it clears the view.
*/
- (void)loadImage:(UIImage *)image ofType:(GVRPanoramaImageType)imageType;
从接口中可以看出,它并不是直接加载网络图片,而是使用的UIImage。所以在使用这两个接口之前,需要先从网络上下载图片资源。
枚举类型GVRPanoramaImageType的有两个可选值(kGVRPanoramaImageTypeMono和kGVRPanoramaImageTypeStereoOverUnder)。前者指定单个图像源图像,后者指有上下两部分图像源的图像,上半部分对应左眼,下半部对应右眼。
GVRPanoramaView的父类GVRWidgetView,从GVRWidgetView头文件中看出,它可以允许操作某些属性,如在View上是否显示信息按钮、跳转VR的按钮等,如展示模式(嵌入父View/全景/全景+VR/)。我们根据需要在GVRPanoramaView的子类中设置好值。GVRWidgetView还提供代理,可以帮我开发者去了解GVRPanoramaView的load情况(如load成功或失败)。
看了上面的分析,我们就知道怎么做了,我们可以使用常用的SDWebImage来下载图片然后加载全景图。
[[SDWebImageManager sharedManager] loadImageWithURL:[NSURL URLWithString:VR_IMG_URL] options:SDWebImageScaleDownLargeImages progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {
float progress = receivedSize*100/expectedSize;
NSLog(@"当前下载进度:%.2lf%%",progress);
} completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
if (image) {
// @autoreleasepool {
[self.panoramaView loadImage:image];
// };
}
if (error) {
NSLog(@"下载图片失败");
}
}];
// 自定义一些相关配置
- (GVRPanoramaView *)panoramaView {
if (!_panoramaView) {
_panoramaView = [[GVRPanoramaView alloc]initWithFrame:self.view.bounds];
_panoramaView.enableTouchTracking = YES;
_panoramaView.enableInfoButton = YES;
_panoramaView.enableFullscreenButton = YES;
_panoramaView.enableCardboardButton = YES;
}
return _panoramaView;
}
当然一些加载进度和placeholder的展示需要我们自己添加。我这里没有自己添加,之后可以根据不同要求进行自定义设置。
三、全景视频的加载展示
GVRSDK提供全景图片播放的类是GVRVideoView,它支持load和对视频源播放、暂停和停止的控制
/**
* Load a local or remote video from a url and start playing.
*
* The video is assumed to be of type ::kGVRVideoTypeMono.
*/
- (void)loadFromUrl:(NSURL*)videoUrl; /**
* Load a local or remote video from a url and start playing.
*
* The video type is set by @c videoType.
*/
- (void)loadFromUrl:(NSURL*)videoUrl ofType:(GVRVideoType)videoType; /** Pause the video. */
- (void)pause; /** Start or resume the video. */
- (void)play; /** Stop the video. */
- (void)stop;
loadFromUrl:中的参数videoUrl,不仅可以是线上的视频源的URL,还可以是本地的视频资源的URL,比GVRPanoramaView的load接口更强大。我们可以不用去操心下载视频的问题。
枚举类型GVRVideoType的有三个可选值。 kGVRVideoTypeMono、 kGVRVideoTypeStereoOverUnder 和 kGVRVideoTypeSphericalV2,kGVRVideoTypeMono代表单个视频源的视频,kGVRVideoTypeStereoOverUnder是有上下两部分视频源的视频,kGVRVideoTypeSphericalV2代表是球形视频源的视频。
GVRVideoView的也是父类GVRWidgetView。
GVRVideoView还提供GVRVideoViewDelegate,代理中方法可以获得视频的播放进度。
#pragma mark - UINavigationControllerDelegate
// 将要显示控制器
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
// 判断要显示的控制器是否是自己
BOOL isShowHomePage = [viewController isKindOfClass:[self class]];
[self.navigationController setNavigationBarHidden:isShowHomePage animated:YES];
} #pragma mark - GVRVideoViewDelegate
- (void)widgetViewDidTap:(GVRWidgetView *)widgetView {
if (_isPaused) {
[_videoView play];
} else {
[_videoView pause];
}
_isPaused = !_isPaused;
} - (void)widgetView:(GVRWidgetView *)widgetView didLoadContent:(id)content {
NSLog(@"Finished loading video");
[_videoView play];
_isPaused = NO;
} - (void)widgetView:(GVRWidgetView *)widgetView didFailToLoadContent:(id)content withErrorMessage:(NSString *)errorMessage {
NSLog(@"Failed to load video: %@", errorMessage);
} - (void)videoView:(GVRVideoView*)videoView didUpdatePosition:(NSTimeInterval)position {
// Loop the video when it reaches the end.
NSLog(@"-------didUpdatePosition:::::%f\n------playableDuration:%f\n------duration:%f",position,videoView
.playableDuration,videoView.duration);
if (position == videoView.playableDuration || isnan(position)) {
[_videoView seekTo:0];
[_videoView play];
}else{ }
} - (GVRVideoView *)videoView {
if (!_videoView) {
_videoView = [[GVRVideoView alloc]initWithFrame:CGRectMake(0, 0, MAX(SCREEN_WIDTH, SCREEN_HEIGHT), MIN(SCREEN_WIDTH, SCREEN_HEIGHT))];
_videoView.delegate = self;
_videoView.enableFullscreenButton = YES;
_videoView.enableCardboardButton = YES;
_videoView.enableTouchTracking = YES;
_videoView.enableInfoButton = NO;
}
return _videoView;
}
当然如果是x正式应用中,placeholderView、ProgressHUD、播放进度条和播放按钮这些都是必不可少的。耳机的插入和拔出也是需要处理的,我这边就没有进行处理。
【iOS】VR实践--GVR的简单使用的更多相关文章
- iOS 开发实践之 Auto Layout
原:http://xuexuefeng.com/autolayout/?utm_source=tuicool 本文是博主 iOS 开发实践系列中的一篇,主要讲述 iOS 中 Auto Layout(自 ...
- (转)iOS 最佳实践
本文转自http://www.jianshu.com/p/b0bf2368fb95 感谢作者和译者 iOS最佳实践 iOS最佳实践 译者注 本文翻译自 futurice 公司的 iOS Good Pr ...
- iOS开发多线程篇—多线程简单介绍
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- iOS开发UI篇—UITabBarController简单介绍
iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...
- iOS开发UI篇—Modal简单介绍
iOS开发UI篇—Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的 ...
- iOS开发数据库篇—SQLite简单介绍
iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...
- iOS开发UI篇—Kvc简单介绍
ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...
- iOS开发UI篇—iOS开发中三种简单的动画设置
iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...
- iOS开发UI篇—UIWindow简单介绍
iOS开发UI篇—UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...
- iOS开发UI篇—Quartz2D简单介绍
iOS开发UI篇—Quartz2D简单介绍 一.什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\ ...
随机推荐
- MongoDB入门实战教程(12)
MongoDB在4.2版本开始全面支持了多文档事务,这也让MongoDB可以作为OLTP的选项之一,本篇我们就来学习一下MongoDB的多文档事务. 1 ACID支持程度 谈到事务,就不得不提经典的A ...
- C# 列表项下拉窗口宽度自适应
/// <summary> /// 列表项下拉窗口宽度自适应 /// </summary> /// <param name="comboBox"> ...
- 让 Python 代码飙升330倍:从入门到精通的四种性能优化实践
花下猫语:性能优化是每个程序员的必修课,但你是否想过,除了更换算法,还有哪些"大招"?这篇文章堪称典范,它将一个普通的函数,通过四套组合拳,硬生生把性能提升了 330 倍!作者不仅 ...
- Java开发笔记(一百五十四)StringBuffer和StringBuilder的由来
本来String类已经能够完成字符串操作的所有功能,为何Java又提供了专门的StringBuffer和StringBuilder呢?这要从String类的设计说起了,查看String的源码,发现其内 ...
- vscode prettier
前言 与通过npm安装的prettier关联 vscode 的 prettier 扩展,会优先使用 你项目中明确安装的 prettier(既 npm i prettier --D) 的版本, 如果你没 ...
- 杂谈 1:论 [l, r] 之间的非平方数
杂谈 1:论 \([l, r]\) 之间的非平方数 Part 0 例题 先看一道例题: 给定两个数 \(l, r\),求 \(l \sim r\) 之间有多少个数不是平方数.平方数的定义:是一个数的平 ...
- POLIR-Economics-Investment: 公司估值模型(一)-- FCF模型
POLIR-Economics-Investment:投资与国际地缘政治 公司估值模型(一)-- FCF模型 Abbreviations FCF: Free Cash Flow DDM: Divide ...
- Unity组件式思想框架 非常好用
改良了几代版本 组件式设计思想 using System; using System.Collections.Generic; using UnityEngine; public class Enti ...
- luoguP1102-双指针
题目链接:P1102 A-B 数对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 利用单调性求解 双指针解法:排序构造出区间单调,则若存在目标值B,B在序列中一定为连续区间,此时通 ...
- 解锁音频创作新可能:AI 人声伴奏分离神器 Replay 深度解析
在音频创作.编辑以及日常娱乐的世界里,我们常常会遇到这样的难题:想要某首歌曲的纯净伴奏用于翻唱,或是想从一段视频中提取清晰人声素材,传统方法要么复杂繁琐,要么效果差强人意.不过,现在有了一款名为Rep ...