2009-10-03 3 views
7

웹캠에서 비디오를 캡쳐 할 수있는 소프트웨어를 구현 중입니다. Apple Dev에서 MyRecorder 샘플을 보았지만 정상적으로 작동합니다.웹캠의 코코아 캡쳐 프레임

- (IBAction)addFrame:(id)sender 
{ 
    CVImageBufferRef imageBuffer; 
    @synchronized (self) { 
     imageBuffer = CVBufferRetain(mCurrentImageBuffer); 
    } 
    if (imageBuffer) { 
    [ bla bla bla ]  
    } 
} 

을하지만 mCurrentImageBuffer은 항상 비어 :

이 코드와 비디오에서 스냅 샷을 버튼을 추가하려고했습니다. 웹캠에서 현재 프레임을 가져 와서 mCurrentImageBuffer를 넣을 수 있습니까?

나는

(void)captureOutput:(QTCaptureOutput *)captureOutput 
        didOutputVideoFrame:(CVImageBufferRef)videoFrame 
        withSampleBuffer:(QTSampleBuffer *)sampleBuffer 
        fromConnection:(QTCaptureConnection *)connection 
{ 
    CVImageBufferRef imageBufferToRelease; 

    CVBufferRetain(videoFrame); 

    @synchronized (self) { 
     imageBufferToRelease = mCurrentImageBuffer; 
     mCurrentImageBuffer = videoFrame; 
    } 
    CVBufferRelease(imageBufferToRelease); 
} 

을 사용하려했지만 그것은 호출 적이 없어요. 어떻게 captureOutput 대리자 메서드 호출을 결정할 수 있습니까? 아이디어가 있으십니까?

덕분에, 안드레아

+0

비디오 초기화가 끝난 후 QTCaptureDecompressedVideoOutput 정의 코드를 옮겼습니다. 이제는 mCurrentImageBuffer가 비어 있지만 디스크에 비디오가 저장되지 않습니다. –

+0

[imagesnap] (http://iharder.sourceforge.net/current/) macosx/imagesnap /) 오픈 소스 프로젝트는 웹캠 사진을 찍기위한 객관적인 C 명령 행 도구입니다. –

답변

3

웹캠에서 비디오를 캡처하는 데 QTKit Capture API를 사용하려는 것 같습니다. MyRecorder 샘플 응용 프로그램은이 API를 사용하여 만들 수있는 가장 간단한 기능을 수행하는 비디오 캡처 프로그램입니다. 설명에서 분명하지 않지만, 예를 따르고 MyRecorderController 내의 -awakeFromNib 메소드에서와 동일한 방식으로 비디오 세션을 초기화해야합니다. 그렇게하지 않으면 비디오가 캡처되지 않습니다.

지금까지 사용하려는 방법이 -captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection: 인 경우 QTCaptureDecompressedVideoOutput의 대리자 메서드입니다. 이 샘플은 압축 된 비디오 만 디스크에 기록하기 때문에이 클래스의 인스턴스는 MyRecorder 샘플에 없습니다. 이를 사용하려면 QTCaptureDecompressedVideoOutput의 인스턴스를 만들고 을 사용하여 QTCaptureSession에 연결하고 QTCaptureDecompressedVideoOutput 인스턴스의 대표자를 클래스로 설정해야합니다.

QTKit이 이러한 종류의 작업을 처리하는 방법에 대한 자세한 내용은 QTKit Application Programming GuideQTKit Capture 섹션을 참조하십시오.

+0

-awakeFromNib 메서드에서 QTCaptureDecompressedVideoOutput을 선언했으며이를 QTCaptureSession에 추가했습니다.이 경우 이미지 캡처가 제대로 작동하고 비디오가 디스크에 저장되지 않습니다. –

+0

문제는 내가 addOutput의 두 가지 유형 : 이미지를 저장하는 QTCaptureDecompressedVideoOutput과 비디오를 저장하는 mCaptureMovieFileOutput입니다. 2 개의 출력을 가질 수 있습니까? 아니면 2 QTCaptureSession을 정의 할 수 있습니까? –

+0

하나의 비디오 입력으로 두 개의 출력을 가질 수 있어야합니다. Apple은 위에 링크 된 QTKit 가이드에서이 순서도를 보여줍니다. 이미지를 캡처하는 데 프로세서가 얼마나 집중적입니까? 아마 대리자 메서드에서 비디오 녹음을 수행 할 수있을만큼 빠르지 않을 수도 있습니다. 기본적으로 비디오 캡처는 꽤 무거운 H.264 인코딩을 사용합니다. 비디오를 QTCompressionOptions240SizeMPEG4Video로 설정하고 어떤 일이 일어나는지보십시오. –

3

나는

- (void)captureOutput:(QTCaptureOutput *)captureOutput 
           didOutputVideoFrame:(CVImageBufferRef)videoFrame 
           withSampleBuffer:(QTSampleBuffer *)sampleBuffer 
           fromConnection:(QTCaptureConnection *)connection 

을 사용하려했지만 그것은 호출 적이 없어요.

이 메서드는 개체를 캡처 출력 개체의 대리자입니까?

+1

이것은 내 문제이다. 나는이 단계를 잘 이해하지 못한다. –

+0

캡처 출력 개체의 대리자 여야합니다. 캡쳐 출력 객체의 http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html 및'setDelegate :'메소드를 참조하십시오. –

+0

완벽한, 나는 애플 샘플 (매우 유용한) 감사에 봤어! –