2012-12-31 88 views
4

我試圖讓來自AVCaptureVideoDataOutputAVCaptureAudioDataOutputCMSampleBufferRef委託AVCaptureVideoDataOutput和AVCaptureAudioDataOutput

AVCamRecorder.h

#import <AVFoundation/AVFoundation.h> 

@interface AVCamRecorder : NSObject { 
} 
    @property (nonatomic,retain) AVCaptureVideoDataOutput *videoDataOutput; 
    @property (nonatomic,retain) AVCaptureAudioDataOutput *audioDataOutput; 

@end 

AVCamRecorder.m

#import "AVCamRecorder.h" 
#import <AVFoundation/AVFoundation.h> 

@interface AVCamRecorder (VideoDataOutputDelegate) <AVCaptureVideoDataOutputSampleBufferDelegate> 
@end 
@interface AVCamRecorder (AudioDataOutputDelegate) <AVCaptureAudioDataOutputSampleBufferDelegate> 
@end 


-(id)initWithSession:(AVCaptureSession *)aSession 
{ 

    self = [super init]; 
    if (self != nil) { 

     //AudioDataoutput 
     AVCaptureAudioDataOutput *aAudioDataOutput = [[AVCaptureAudioDataOutput alloc] init]; 

     //VideoDataoutput 
     AVCaptureVideoDataOutput *aMovieDataOutput = [[AVCaptureVideoDataOutput alloc] init]; 


     if ([aSession canAddOutput:aAudioDataOutput]) { 
      [aSession addOutput:aAudioDataOutput]; 
     }   
     if ([aSession canAddOutput:aMovieDataOutput]) { 
     [aSession addOutput:aMovieDataOutput]; 
     } 

     [aAudioDataOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; 
     [aMovieDataOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; 

     [self setAudioDataOutput:aAudioDataOutput]; 
     [self setVideoDataOutput:aMovieDataOutput]; 

     [self setSession:aSession]; 

    } 
    return self; 
} 

@implementation AVCamRecorder (VideoDataOutputDelegate) 
- (void)captureOutput:(AVCaptureOutput *)captureOutput 
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
     fromConnection:(AVCaptureConnection *)connection 
{ 
    NSLog(@"VideoDataOutputDelegate = %@", captureOutput); 
}  
@end 

@implementation AVCamRecorder (AudioDataOutputDelegate) 
- (void)captureOutput:(AVCaptureOutput *)captureOutput 
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
     fromConnection:(AVCaptureConnection *)connection 
{ 
    NSLog(@"AudioDataOutputDelegate = %@", captureOutput); 
} 
@end 

奇怪的是,我在 「@implementation AVCamRecorder (AudioDataOutputDelegate)

AudioDataOutputDelegate = <AVCaptureVideoDataOutput: 0x208a7df0> 

我切換了視頻數據的「@implementation AVCamRecorder (VideoDataOutputDelegate)」和「@implementation AVCamRecorder (VideoDataOutputDelegate)」我的訂單,並得到了

VideoDataOutputDelegate = <AVCaptureVideoDataOutput: 0x208a7df0> 

看來,我不能設置2「captureOutput:didOutputSampleBuffer:fromConnection:」。否則,數據將進入其中一個。

或者,我在設置「@implementation AVCamRecorder (VideoDataOutputDelegate)」和「@implementation AVCamRecorder (AudioDataOutputDelegate)」時犯了錯誤嗎?

我想我不需要單獨回撥,但我只是想知道什麼是錯的。

非常感謝您的幫助。

回答

1

你在同一類

AVCamRecorder (VideoDataOutputDelegate) 
AVCamRecorder (AudioDataOutputDelegate) 

聲明同樣的方法

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

這導致不確定的行爲定義2個類別。見Avoid Category Method Name Clashes在「編程使用Objective-C的」指南:

如果在一個類中聲明的方法的名稱是一樣的,在原來的類中的方法 ,或者在相同的另一個類別的方法 類(甚至超類),行爲未定義,在運行時使用哪個方法實現。
...

因此,您的設置無法正常工作。你可以代替

  • 定義兩個單獨,一個音頻和一個視頻代表,
  • 定義一個類類別作爲音頻+視頻委託(和在回調方法檢查其功能它被稱爲),
  • 只是使用AVCamRecorder本身作爲音頻+視頻代表。
+0

非常感謝!它對我來說。其實,我不明白類別。我真的很感激。 – user1428156