2017-03-12 3 views
0

저는이 AVFoundation 카메라 앱을 가지고 있습니다. 카메라 미리보기는 didOutputSampleBuffer 메서드에 의해 적용된 필터의 결과입니다. 애플은 흑 마술을 사용하여 카메라의 미리보기 방향을 잡았습니까?

나는 카메라 설정 나는 사과가 샘플 코드 ( CIFunHouse) 중 하나에 무슨 짓을했는지 다음입니다 :

// setting up the camera 
    CGRect bounds = [self.containerOpenGL bounds]; 

    _eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3]; 

    _videoPreviewView = [[GLKView alloc] initWithFrame:bounds 
              context:_eaglContext]; 

    [self.containerOpenGL addSubview:_videoPreviewView]; 
    [self.containerOpenGL sendSubviewToBack:_videoPreviewView]; 

    id<MTLDevice> device = MTLCreateSystemDefaultDevice(); 

    NSDictionary *options = @{kCIContextUseSoftwareRenderer : @(NO), 
          kCIContextPriorityRequestLow : @(YES), 
          kCIContextWorkingColorSpace : [NSNull null]}; 

    _ciContext = [CIContext contextWithEAGLContext:_eaglContext options:options]; 

    [_videoPreviewView bindDrawable]; 
    _videoPreviewViewBounds = CGRectZero; 
    _videoPreviewViewBounds.size.width = _videoPreviewView.drawableWidth; 
    _videoPreviewViewBounds.size.height = _videoPreviewView.drawableHeight; 

    dispatch_async(dispatch_get_main_queue(), ^(void) { 
    CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI); 

    _videoPreviewView.transform = transform; 
    _videoPreviewView.frame = bounds; 

    }); 

self.containerOpenGL 전체 화면보기이며, 화면의 네 모서리에 제한됩니다. 자동 회전이 켜져 있습니다.

그러나 이것은 문제 ...

때 I 설치 GLKView self.ciContext 및 그 장치를 가정하면, 특정 방향에 생성된다. 장치가 특정 방향에 있고 응용 프로그램을 실행하는 경우 previewView은 전체 self.containerOpenGL 영역에 맞지만 장치를 회전하면 previewView이 가운데에 위치합니다.

저는 Apple 코드가 완벽하게 작동하며 어떤 제약도 사용하지 않는 것을 봅니다. 자동 회전 방법을 사용하지 않고 didLayoutSubviews을 사용하지 않고 장치를 회전하고 코드를 실행하면 모든 내용이 미리보기를 제외하고 회전합니다. 그리고 그보다 더 나쁜 것은 내 previewView이 회전하는 것처럼 보이지만 회전하지는 않습니다.

검은 색 마술입니까? 그들이 어떻게합니까?

+0

유연한 너비와 높이의 자동 크기 조정을 사용하고 있습니까? – agibson007

답변

1

uiwindow에 미리보기를 추가하기 때문에 회전하지 않습니다. 이 질문에 대한 답변을 바랍니다. 그렇지 않다면 나는 그들의 소스 코드를 계속 살펴볼 것입니다.

견적 소스 코드입니다.

우리는 비디오 미리보기를 윈도우의 서브뷰로 만들고 그것을 뒤로 보냅니다. 이것은

그들은 또한이

_videoPreviewView.enableSetNeedsDisplay = NO; 

이에서 계속 수도 추가 비디오 미리 위에 FHViewController의 뷰 (및 UI 요소)하게하고, 또한 장치의 회전에 영향을받지 않는 화상을 미리 만들어 또한 응답합니다.

편집 : 이제 미리보기가 회전하고 UI가이를 처리하기 위해 두 번째 창을 추가하여 뒷면으로 보내고 기본 창을 지우고 미리보기를 au가 아니라고 알려주는 dummyViewController가있는 두 번째 창 적절한 방법을 재정 의하여 회전 시키십시오. 이렇게하면 미리보기가 회전하지 않고 UI가 회전합니다.

+0

당신은 바로 선생님입니다! 나는 그것을 알아 채지 못했다! 감사! – SpaceDog

+0

이상하게도 내 previewView를 창에 추가했는데 여전히 회전합니다 ... :( – SpaceDog

+0

viewcontroller에서도 다소 어중간한 참조가 있습니까? 미리보기에서 자동 크기 조정을 유연한 높이 및 너비로 설정하십시오 – agibson007