我正在構建一個iOS應用程序(我的第一個),它可以實時處理視頻靜幀。爲了深入瞭解這一點,我遵循了Apple的example from the AV* documentation。AVCaptureDeviceOutput不調用委託方法captureOutput
該過程涉及設置輸入(相機)和輸出。輸出與委託一起工作,在這種情況下委託是控制器本身(它符合並實現所需的方法)。
我遇到的問題是委託方法永遠不會被調用。下面的代碼是控制器的實現,它有幾個NSLog。我可以看到「已啓動」消息,但「所謂的委託方法」從未顯示。
此代碼全部在實現「AVCaptureVideoDataOutputSampleBufferDelegate」協議的控制器中。
- (void)viewDidLoad {
[super viewDidLoad];
// Initialize AV session
AVCaptureSession *session = [AVCaptureSession new];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
[session setSessionPreset:AVCaptureSessionPreset640x480];
else
[session setSessionPreset:AVCaptureSessionPresetPhoto];
// Initialize back camera input
AVCaptureDevice *camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:camera error:&error];
if([session canAddInput:input]){
[session addInput:input];
}
// Initialize image output
AVCaptureVideoDataOutput *output = [AVCaptureVideoDataOutput new];
NSDictionary *rgbOutputSettings = [NSDictionary dictionaryWithObject:
[NSNumber numberWithInt:kCMPixelFormat_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
[output setVideoSettings:rgbOutputSettings];
[output setAlwaysDiscardsLateVideoFrames:YES]; // discard if the data output queue is blocked (as we process the still image)
//[output addObserver:self forKeyPath:@"capturingStillImage" options:NSKeyValueObservingOptionNew context:@"AVCaptureStillImageIsCapturingStillImageContext"];
videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", DISPATCH_QUEUE_SERIAL);
[output setSampleBufferDelegate:self queue:videoDataOutputQueue];
if([session canAddOutput:output]){
[session addOutput:output];
}
[[output connectionWithMediaType:AVMediaTypeVideo] setEnabled:YES];
[session startRunning];
NSLog(@"started");
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
NSLog(@"delegate method called");
CGImageRef cgImage = [self imageFromSampleBuffer:sampleBuffer];
self.theImage.image = [UIImage imageWithCGImage: cgImage ];
CGImageRelease(cgImage);
}
注:我與iOS 5.0建設爲目標。
編輯:
我發現一個question,雖然要求解決不同的問題,是做什麼我的代碼是應該做的。我已將該問題的代碼逐字複製到空白的xcode應用程序中,並將NSLog添加到捕獲輸出函數,並且它不會被調用。這是一個配置問題?有什麼我失蹤?
如果開始運行會話時發生錯誤(可能是因爲您沒有收到任何幀),那麼它會發佈一個'AVCaptureSessionRuntimeErrorNotification'通知。使用'[[NSNotificationCenter defaultCenter] addObserver:selector:name:object:];'來監聽它,當你的選擇器被調用時,從用戶字典中獲取'AVCaptureSessionErrorKey'來查看錯誤。 – lnafziger
感謝您的輸入@Inafziger。我訂閱了AVCaptureSessionRuntimeErrorNotification,但似乎沒有觸發:| – SuitedSloth
通過什麼方式創建視圖控制器? '開始'獲得輸出嗎? – Tommy