2011-01-18 3 views
0

현재 모션 검색 게임용 웹캠에서 프레임을 변경하는 방법을 알아 내려고하고 있습니다. 나는 Objective-C에 매우 익숙하며, 이것을하기위한 간단한 방법을 찾을 수 없었다. 생성 된 오류 메시지가 말한다NSRect 프레임이 잘못된 식별자 = [자체 프레임]

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


    CIContext *myCIContext; 
    const NSOpenGLPixelFormatAttribute attr[] = { 
     NSOpenGLPFAAccelerated, 
     NSOpenGLPFANoRecovery, 
     NSOpenGLPFAColorSize, 32, 
     0 
    }; 
    NSOpenGLPixelFormat *pf = [[NSOpenGLPixelFormat alloc] initWithAttributes:(void *)&attr]; 
    myCIContext = [CIContext contextWithCGLContext: CGLGetCurrentContext() 
             pixelFormat: [pf CGLPixelFormatObj] 
              options: nil]; 
    CVImageBufferRef releasedImageBuffer; 
    CVBufferRetain(videoFrame); 

    CIImage *picture = [CIImage imageWithCVImageBuffer:releasedImageBuffer]; 
    NSRect frame = [self frame]; 
    CGRect imageRect; 
    imageRect = [picture extent]; 

    [colorCorrectionFilter setValue:picture forKey:@"inputImage"]; 
    [effectFilter setValue:[colorCorrectionFilter valueForKey:@"outputImage"] forKey:@"inputImage"]; 

    // render our resulting image into our context 
    [ciContext drawImage:[compositeFilter valueForKey:@"outputImage"] 
       atPoint:CGPointMake((int)((frame.size.width - imageRect.size.width) * 0.5), (int)((frame.size.height - imageRect.size.height) * 0.5)) // use integer coordinates to avoid interpolation 
       fromRect:imageRect]; 

    @synchronized(self) 
    { 
     //basically, have frame to be released refer to the current frame 
     //then update the reference to the current frame with the next frame in the "video stream" 
     releasedImageBuffer = mCurrentImageBuffer; 
     mCurrentImageBuffer = videoFrame; 
    } 

    CVBufferRelease(releasedImageBuffer); 

} 

: 여기

내 질문은이 방법에 관한 오류 메시지에 관한

warning: 'MyRecorderController' may not respond to '-frame' 
error: invalid initializer 

및 라인은

NSRect frame = [self frame]; 

입니다 강조된 내 헤더는 현재 다음과 같습니다.

#import <QuickTime/ImageCompression.h> 
#import <QuickTime/QuickTime.h> 
#import <Cocoa/Cocoa.h> 
#import <QTKit/QTKit.h> 
#import <OpenGL/OpenGL.h> 
#import <QuartzCore/QuartzCore.h> 
#import <CoreVideo/CoreVideo.h> 


@interface MyRecorderController : NSObject{ 
    IBOutlet QTCaptureView *mCaptureView; 

    IBOutlet NSPopUpButton *videoDevicePopUp; 
    NSMutableDictionary *namesToDevicesDictionary; 
    NSString *defaultDeviceMenuTitle; 

    CVImageBufferRef mCurrentImageBuffer; 
    QTCaptureDecompressedVideoOutput *mCaptureDecompressedVideoOutput; 

    // filters for CI rendering 
    CIFilter   *colorCorrectionFilter; // hue saturation brightness control through one CI filter 
    CIFilter   *effectFilter;   // zoom blur filter 
    CIFilter   *compositeFilter;  // composites the timecode over the video 
    CIContext   *ciContext; 

    QTCaptureSession *mCaptureSession; 
    QTCaptureMovieFileOutput *mCaptureMovieFileOutput; 
    QTCaptureDeviceInput *mCaptureDeviceInput; 

} 

@end 

튜토리얼 코드를 살펴 봤는데 잘못했는지 이해하지 못합니다. 내가 볼 수있는 한 (다양한 샘플 코드로 판단)이 프로토콜을 포함 할 필요는 없습니다. 다른 웹 사이트에서 제안한 것입니다. 그래도 난 그것을 시도하고, 컴파일 않는 동안은 출력 끝 :

2011-01-18 10:19:11.511 MyRecorder[9972:c903] -[MyRecorderController frame]: unrecognized selector sent to instance 0x1001525f0 
2011-01-18 10:19:11.512 MyRecorder[9972:c903] *** Ignoring exception: -[MyRecorderController frame]: unrecognized selector sent to instance 0x1001525f0 

이 발생했습니다 내가 잘못했던 것도 있습니까? 그렇지 않은 경우 웹캠에서 프레임을 조작하고 화면에 출력 할 수있는 더 좋은 방법이 있습니까?

감사합니다.

답변

2

MyRecorderController에서 메서드 프레임을 호출하려고합니다.이 메서드 프레임은 그 메서드가 없습니다. 해당 클래스가 UIView에서 상속되어야하거나 해당 메소드를 구현해야 할 수 있습니다.

어떤 프레임을 의미하는지 스스로 물어보고 적절한 방법을 쓰십시오.

+0

NSObject의 '프레임'에 대한 상속을위한 NSView의 메서드가 있어야한다고 생각합니다. 헤더는 NSObject에서 상속되므로 거기에 있어야합니다. X-Code에서 '프레임'메서드를 클릭하면 클래스가 많이 생기고 NSView는 그 중 하나입니다. 구현할 프레임 * 메서드를 정의하지 않은 문제가 여기 있습니까? – Moonlight293

+0

그러나 MyRecorderController는 NSView에서 파생되지 않으므로 NSView의 메서드가있는 이유는 무엇입니까? –

+0

"NSRect frame = [self frame];"이라고 말하면 어떤 프레임을 의미합니까? 답을 아는 사람에게는 해결 방법이 있습니다. :-) – Eiko

관련 문제