AVCaptureOutput captureStillImageAsynchronouslyFromConnection永远不会在iPhone5上完成

时间:2012-09-25 20:10:53

标签: ios

在我的应用程序中,我正在显示 AVCaptureVideoPreviewLayer ,然后在用户使用 AVCaptureOutput 中的 captureStillImageAsynchronouslyFromConnection 功能单击按钮时捕获静止图像。这对我来说效果很好,直到iPhone 5,它永远不会完成。

我的设置代码是:

...
self.imageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];
[self.imageOutput setOutputSettings:outputSettings];

self.captureSession = [[[AVCaptureSession alloc] init] autorelease];
[self.captureSession addInput:self.rearFacingDeviceInput];
[self.captureSession addOutput:self.imageOutput];
[self.captureSession setSessionPreset:AVCaptureSessionPresetPhoto];

self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession];
self.previewLayer.frame = CGRectMake(0, 0, 320, 427);
self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspect;

[self.captureSession startRunning];
[outputSettings release];

我的捕获方法是:

AVCaptureConnection *videoConnection = nil;
for (AVCaptureConnection *connection in self.imageOutput.connections){
    for (AVCaptureInputPort *port in [connection inputPorts]){
        if ([[port mediaType] isEqual:AVMediaTypeVideo] ){
            videoConnection = connection;
            break;
        }
    }
    if (videoConnection) { break; }
}

//code to abort if not return 'soon'
...

[self.imageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error){

    //use image here

}];

captureStillImageAsynchronouslyFromConnection永远不会为我使用iPhone5完成

我测试过:

  • 这不是OS 6,因为此代码适用于已更新的iPhone 4s和iPod(iPod touch(第4代))

  • captureSession正在运行

  • videoConnection不是零

  • imageOutput不是nil

此外:

  • 我正在使用此方法而不是UIImagePickerController,因为我需要将预览作为子视图。

  • 在iPhone 5上调用 stopRunning 也需要几秒钟

1 个答案:

答案 0 :(得分:0)

嗯,这段代码运行正常。经测试iPhone 4和5(baseSDK 7.1,ARC下)。

你必须考虑很少的事情。

1)确保正确设置了rearFacingDeviceInput,

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
[self setRearFacingDeviceInput:[AVCaptureDeviceInput deviceInputWithDevice:device error:nil]];

2)提到Vincent,会出现错误,尝试同时记录错误和imageSampleBuffer

3)会话的-startRunning和-stopRunning操作需要很长时间才能完成(秒,甚至5-6s),这些方法在完成所有工作之前不会返回,为了避免阻塞UI你不应该调用这些主线程上的方法,一种方法是使用GCD

dispatch_queue_t serialQueue = dispatch_queue_create("queue", NULL);
dispatch_async(serialQueue, ^{
    [self.captureSession startRunning];
});

如果仍然无法完成captureStillImage(确保在块中添加断点并记录所有内容),则应检查设备的摄像头。我相信您的代码适用于所有iPhone 5设备。希望这有帮助,祝你好运。