2012-09-28 2 views
3

다양한 Core xxxx 프레임 워크와 함께 AVFoundation 프레임 워크를 더 잘 이해하기 위해 간단한 비디오 캡처를 시도하고 이미지를 UI에 추가합니다. 저는 rosyWriter 코드와 문서를 보았지만 대답은 없었습니다. 따라서 :captureOutput을 사용하여 비디오 캡쳐 및 이미지 표시 : captureOutput didOutputSampleBuffer : sampleBuffer fromConnection : connection

나는 입력과 출력을 추가하기위한 표준 캡처 세션 코드를 가지고 있습니다.

//moving the buffer processing off the main queue 
dispatch_queue_t bufferProcessingQueue=dispatch_queue_create("theBufferQueue", NULL); 
[self.theOutput setSampleBufferDelegate:self queue:bufferProcessingQueue]; 
dispatch_release(bufferProcessingQueue); 

그리고 대리인 :

-(void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
     fromConnection:(AVCaptureConnection *)connection 
    { 

    CVPixelBufferRef pb = CMSampleBufferGetImageBuffer(sampleBuffer); 

    CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pb]; 
    CGImageRef ref = [self.theContext createCGImage:ciImage fromRect:ciImage.extent]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.testBufferImage.image= [UIImage imageWithCGImage:ref scale:1.0 orientation:UIImageOrientationRight]; 
    }); 
} 

질문 :

1 내가 위에서처럼, 우리는 항상 대리자를 설정해야 추측하고 다음은 질문에 관련이 내가 메인 큐가 아니라 위에서했던 것과 같이 별도의 큐에서 실행하는 것. 옳은?

2 함께 대리자 메서드에서 UI를 처리하는 모든 호출을 내가했던 것처럼 기본 큐로 되돌려 놓아야합니다. 옳은?

3 5-10 초 후에이 코드를 실행하면 "메모리 수신 경고"오류가 표시되고 응용 프로그램이 종료됩니다. 무엇이 이것을 일으킬 수 있습니까?

미리 감사드립니다. KMB

답변

2

1) 일반적으로 그렇습니다. 메인 큐에서 실행할 수는 있지만 다른 것들 중에서 UI 응답성에 문제가 발생할 수 있습니다.

2) 수정하십시오.

3) 일련의 CGImageRef를 작성 중입니다. 어디에서 풀어주고 있니?

성능 향상을 위해 비디오 렌더링을 세부적으로 제어해야하는 경우 OpenGL을 사용해야합니다. 그렇지 않으면 AVCaptureVideoPreviewLayer를 사용하여 미리보기를 쉽게 얻을 수 있습니다.

+0

스티브 감사합니다. 이것은 단지 초기 테스트 일뿐입니다. 실제로, 내가하려고하는 것은이 이미지를 화면에 렌더링하는 것이 아니라 픽셀을 얻어 분석하는 것입니다. 나는 OpenGL에 들어갈 필요없이 이것을 할 수 있기를 바랬다. 더 자세히 분석 할 수 있도록 여기에 렌더링했습니다. 그래서, 프레임, 브레이크 포인트, 분석, 프로그램을 계속 진행하여 픽셀 분석이 캡처 된 이미지를 반영하는지 확인합니다. 이것을 지나치게 복잡하게 만들고 Open GL을 배워야합니다. 감사합니다 – Spectravideo328

+0

성능상의 이유로 OpenGL을 사용합니다. 이미지 처리와 관련하여 신속하게 작업하고 싶다면 [Brad Larson 's] (http://stackoverflow.com/users/19679/brad-larson) [GPUImage] (http://www.google.com /url?sa=t&rct=j&q=brad%20larson%20gpuimage&source=web&cd=1&cad=rja&ved=0CB0QFjAA&url=https%3A%2F%2Fgithub.com%2FBradLarson%2FGPUImage&ei=OgRmUJmOLevpiwKzhoGoBQ&usg=AFQjCNHzBO8bMGWO2bBFhe8DTjMv7eTQBQ). 당신이하고있는 일은 테스트를하는 것이 좋습니다. 그 CVImageRefs를 어딘가에 CFRelease하십시오. –

+0

ARC를 사용하여 생각했지만 더 이상 객체를 릴리즈 할 필요가 없지만 createCGImage 메소드 세부 정보를 읽고 (CF의 논리를 복사/작성) 도움말을 읽습니다. 도움에 감사드립니다. – Spectravideo328