【发布时间】:2012-11-10 14:01:20
【问题描述】:
我正在构建一个动态处理视频静止帧的 iOS 应用程序(我的第一个)。为了深入了解这一点,我关注了来自 Apple 的 example from the AV* documentation。
该过程涉及设置输入(相机)和输出。输出与委托一起工作,在这种情况下,委托就是控制器本身(它符合并实现所需的方法)。
我遇到的问题是委托方法永远不会被调用。下面的代码是控制器的实现,它有几个 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 应用程序中,将 NSLogs 添加到 captureOutput 函数中并且它没有被调用。这是配置问题吗?我有什么遗漏吗?
【问题讨论】:
-
如果启动会话运行时出错(可能是因为您没有收到任何帧),那么它将发布
AVCaptureSessionRuntimeErrorNotification通知。使用[[NSNotificationCenter defaultCenter] addObserver:selector:name:object:];监听它,当你的选择器被调用时,从用户字典中获取`AVCaptureSessionErrorKey`来查看错误。 -
感谢您的意见@Inafziger。我订阅了 AVCaptureSessionRuntimeErrorNotification 但它似乎没有触发:|
-
视图控制器是通过什么方式创建的? 'started' 有输出吗?
-
@Tommy,视图控制器只是附加到情节提要场景。所以它是通过“标准”方式创建的。 “开始”确实得到输出。我还将代码移到了一个由按钮触发的函数中,以查看它是否与它在 viewDidLoad 中有关,但没有任何变化。
-
我刚刚将我的代码逐字复制到我从 Apple 文档下载的名为“SquareCam”的示例项目中。我经历了整个实现,并在我的实现中将其替换掉。应用程序运行,委托 NSLog 被调用!但不是我的项目。我希望确保我包含所有相同的框架等,但我找不到我丢失的任何代码......这变得很奇怪:(
标签: iphone avfoundation ios5