VR은 아이폰 OS에 상대적으로 화재 주제, 통합 및 파노라마 VR 재생입니다 고려의 매우 가치가 연습을 이동합니다. 최근이 회사는 또한 APP에 VR 기능을 통합하기 위해 준비했다. 그래서 나는 또한 다음 VR 기능의 개발을 이해합니다. 우리가 신속하게 VR, GVRSDK 달성 할 수있는 프로젝트가있다 (구글 VR SDK)이이에 따라 어느 구글에서 제공하는 아주 좋은 대표는, 우리는 신속하게 좋은 성능과 파노라마 VR 플레이어를 얻을 수 있습니다. (+ 비디오 파노라마 사진 파노라마 놀이 연주)
아도, 직접 라인과 코드
A, SDK 소개
수입 GVRSDK은 매우 간단합니다, 우리는 cocoapods을 통해 가져올 수 있습니다.
대상 ' VRDemo은 ' 할 # 주석 다음 줄 경우 당신이 돈 ' t는 동적 프레임 워크 사용하려는 # 포드 에 대한 VRDemo은 깍지 ' GVRSDK ' 대상 ' VRDemoTests이 ' 할 상속을 ! : search_paths # 포드 에 대한 테스트 최종 목표 ' VRDemoUITests은 ' 할 # 포드를 위한 테스트 끝 끝
성공적으로 가져온 후 이러한 결과입니다.
둘째, 부하 표시 파노라마
GVRSDK 파노라마 사진 재생 클래스는 두 개의 부하 인터페이스를 지원, GVRPanoramaView입니다.
/ * * * 형 @c있는 UIImage :: kGVRPanoramaImageTypeMono에서 360 파노라마 이미지를로드. * 화상 * nil이 경우, 상기 뷰를 클리어한다. * / - ( 무효 ) loadImage (있는 UIImage * ) 화상; / * * * 형 @c있는 UIImage :: GVRPanoramaImageType에서 360 파노라마 이미지를로드. * 화상 * nil이 경우, 상기 뷰를 클리어한다. * / - ( 무효 ) loadImage (있는 UIImage *) 화상 ofType (GVRPanoramaImageType)에 imagetype;
인터페이스에서 볼 수 있듯이, 그것은 직접 네트워크 사진을로드하지 않고,있는 UIImage 사용. 그래서 이러한 인터페이스를 사용하기 전에, 당신은 다운로드 사진에 대한 네트워크 자원을 시작해야합니다.
GVRPanoramaImageType 유형은 두 가지 선택 가능한 값 (kGVRPanoramaImageTypeMono 및 kGVRPanoramaImageTypeStereoOverUnder)이 열거. 전자 지정 상부 이미지를 참조하여 좌측 상단 부분에 대응하는 소스 이미지의 하부는 소스 이미지의 하나의 이미지는, 하부 절반은 오른쪽 눈에 대응.
GVRWidgetView 헤더 파일에서 본 GVRPanoramaView 상위 GVRWidgetView는, 이러한 여부를보기 VR 점프 버튼 또는 같은 그러한 프레젠테이션 모드와 (매립 부모보기 / 팬 / 파노라마 +에 표시 버튼에 특정 속성에 오퍼레이터 허락 VR /). 우리는 서브 클래스 GVRPanoramaView에 따라 좋은 값을 설정해야합니다. GVRWidgetView 또한 개발자 (예 : 부하의 성공 또는 실패와 같은) 상황 GVRPanoramaView 부하를 이해하는 데 도움이 수, 에이전트를 제공합니다.
위의 분석을 읽고, 우리는 그것을 수행하는 방법, 우리가 다운로드 사진 다음로드 파노라마에 공통 SDWebImage을 사용할 수 있습니다 알고 있습니다.
[SDWebImageManager sharedManager] loadImageWithURL [NSURL URLWithString : VR_IMG_URL] 선택해 SDWebImageScaleDownLargeImages가 진행 ^ (NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable에서 targetUrl)을 { 플로트 진행 = receivedSize * 100 / expectedSize; NSLog ( @ " 当前下载进度:. % 2LF %% " 진행); } 완료 : ^ (있는 UIImage * _Nullable 이미지있는 NSData * _Nullable 데이터 NSError * _Nullable 에러 SDImageCacheType cacheType는 BOOL 완료, NSURL * _Nullable 이미지 URL) { 경우 (화상) { // @autoreleasepool { [self.panoramaView loadImage : 이미지] ; // }; } IF가 (오류) { NSLog는 ( @ " 다운로드 사진 실패 " ); } }];
//自定义一些相关配置
- (GVRPanoramaView * ) panoramaView { 경우 (! _panoramaView) { _panoramaView = [GVRPanoramaView ALLOC] initWithFrame : self.view.bounds]; _panoramaView.enableTouchTracking = YES; _panoramaView.enableInfoButton = YES; _panoramaView.enableFullscreenButton = YES; _panoramaView.enableCardboardButton = YES; } 반환 _panoramaView을; }
물론, 자리의 일부 및 로딩이 우리가 자신을 추가 할 필요가 진행을 보여줍니다. 나는 당신이 다른 요구 사항에 따라 사용자 정의 할 수 있습니다, 자신을 추가 할 필요가 없습니다.
셋째, panoptic 비디오를로드
GVRSDK 파노라마 사진 재생 클래스는 부하와 비디오 소스 재생, 정지 및 정지 제어를 지원, GVRVideoView입니다
/ * * * URL에서 로컬 또는 원격 비디오를 넣고 재생을 시작합니다. * *이 비디오는 유형으로 가정 :: kGVRVideoTypeMono. * / - ( 무효 ) loadFromUrl (NSURL * )에서는 videoURL; / * * * URL에서 로컬 또는 원격 비디오를 넣고 재생을 시작합니다. * * 비디오 타입 @c videoType 의해 설정된다. * / - ( 무효 ) loadFromUrl (NSURL * )에서는 videoURL ofType (GVRVideoType) videoType; / * * 비디오를 일시 중지합니다. * / - ( 공극 ) 일시; / * * 시작 또는 비디오를 다시 시작합니다. * / - ( 공극 ) 플레이; / * * 비디오를 중지합니다. * / - ( 공극 ) 정지;
loadFromUrl :의 매개 변수에서는 videoURL뿐만 아니라 비디오 소스 라인의 URL은 또한 인터페이스 GVRPanoramaView의 부하보다 더 강력한 URL 로컬 비디오 자원이 될 수있다. 우리는 비디오 문제를 다운로드에 대해 걱정할 필요가 없습니다.
열거 형 GVRVideoType 세 가지 옵션 값이 있습니다. kGVRVideoTypeMono, kGVRVideoTypeStereoOverUnder 및 kGVRVideoTypeSphericalV2는 kGVRVideoTypeMono 비디오 kGVRVideoTypeSphericalV2 대표 구형 비디오 비디오 입력하고, 두 부분 kGVRVideoTypeStereoOverUnder 비디오 소스이며, 하나의 비디오 소스를 나타낸다.
GVRVideoView 또한 부모 GVRWidgetView입니다.
GVRVideoView는 비디오 재생 진행률을 얻을 GVRVideoViewDelegate, 에이전트 방법을 제공합니다.
의 #pragma 마크 - UINavigationControllerDelegate // 컨트롤러 표시 - ( 무효 )있는 navigationController : (※ UINavigationController가)있는 navigationController willShowViewController (의 UIViewController * )에의 ViewController 애니메이션 (BOOL) 애니메이션 { // 제어기가 자신을 표시하도록 결정하면 BOOL isShowHomePage를 = [isKindOfClass의 ViewController : 자기 클래스 ]; [self.navigationController setNavigationBarHidden : 애니메이션 isShowHomePage : YES] } 의 #pragma 마크 - GVRVideoViewDelegate - ( 무효 ) widgetViewDidTap (GVRWidgetView * ) widgetView { IF (_isPaused) { [_videoView 재생]; } 다른 { [_videoView 일시]; } _isPaused =! _isPaused; } - ( 무효 ) widgetView : (GVRWidgetView *) widgetView didLoadContent :( ID ) 내용 { NSLog ( @ " 완료 로딩 비디오 " ); [_videoView 플레이]; _isPaused = NO; } - ( 무효 ) widgetView : (GVRWidgetView *) widgetView didFailToLoadContent :( ID ) 내용 withErrorMessage : (있는 NSString * ) ERRORMESSAGE { NSLog는 ( @ " 로드 비디오에 실패 : %를 @ " , ERRORMESSAGE); } - (+ 무효) VideoView를 지켜 보면서 (GVRVideoView * ) VideoView를 지켜 보면서 didUpdatePosition (NSTimeInterval) 위치 { // 루프가 끝에 도달 비디오. NSLog ( @ " ------- didUpdatePosition ::::: % F \ n ------ playableDuration % F \ n ------ 시간 : %의 F " 위치, VideoView를 지켜 보면서 .playableDuration , videoView.duration); 경우 (위치 == videoView.playableDuration || 때는 isNaN (위치)) { [_videoView seekTo : 0 ]; [_videoView 플레이]; } 다른 { } } - (GVRVideoView * ) VideoView를 지켜 보면서 { 경우 (! _videoView) { _videoView = [GVRVideoView ALLOC] initWithFrame : CGRectMake ( 0 , 0 , MAX (SCREEN_WIDTH, SCREEN_HEIGHT), MIN (SCREEN_WIDTH, SCREEN_HEIGHT))]; _videoView. 위임 = 자기; _videoView.enableFullscreenButton = YES; _videoView.enableCardboardButton = YES; _videoView.enableTouchTracking = YES; _videoView.enableInfoButton = NO; } 반환 _videoView을; }
x는 공식적인 응용 프로그램의 경우 물론, placeholderView, ProgressHUD, 재생 진행률 표시 줄과 재생 버튼이 필수적이다. 헤드폰 삽입 및 제거도 내가 여기에 처리되지 않을 것이다, 해결 될 필요가있다.