CaptureStillImageAsynchronouslyFromConnection for Back camera的问题

时间:2015-03-17 12:10:58

标签: ios iphone swift avcapturesession

let VideoDevice = CameraWithPosition(AVCaptureDevicePosition.Back) // not working

let VideoDevice = CameraWithPosition(AVCaptureDevicePosition.Front) // working

if let stillOutput = self.stillImageOutput {

                if let videoConnection = stillOutput.connectionWithMediaType(AVMediaTypeVideo)
                {
                    println("stillOutput \(stillOutput)")

                        stillOutput.captureStillImageAsynchronouslyFromConnection(videoConnection){
                            (imageSampleBuffer : CMSampleBuffer!, _) in

                            println("imageSampleBuffer \(imageSampleBuffer)") //prints nil for back camera, works for front camera

...more code

我可以从前置摄像头捕获图像,但是同样的过程对我的Iphone的后置摄像头不起作用,两个摄像头有不同的设置吗?

将后摄像头的imageSampleBuffer作为nil接收..

错误日志:

错误域= AVFoundationErrorDomain代码= -11800"操作无法完成" UserInfo = 0x1704682c0 {NSUnderlyingError = 0x170255d20"操作无法完成。 (OSStatus错误-16803。)",NSLocalizedFailureReason =发生未知错误(-16803),NSLocalizedDescription =操作无法完成}

3 个答案:

答案 0 :(得分:1)

检查 “......更多代码”

前置摄像头将更快地返回图像,因此如果您在captureStillImageAsynchronouslyFromConnection之后停止预览或直接对videoConnection进行其他更改,则它可能适用于前置摄像头,但不适用于后置摄像头。

答案 1 :(得分:0)

尝试

NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in videoDevices)
{
    NSLog(device.description);
}

看看你是否收到了这样的消息:

AVCaptureFigVideoDevice: hex[Back Camera][com.apple.avfoundation.avcapturedevice.built-in_video:0]

当我无法使用相机时出现问题,它不会出现在设备列表中。然后我注意到即使是标准的相机应用程序也无法正常工作。所以我只是重装了我的iPad,它解决了我的问题。我认为在测试我的应用程序时,我设法以某种方式改变了重要的东西。

答案 2 :(得分:-1)

我的解决方案: capturePhotoif(!CMSampleBufferIsValid(imageSampleBuffer)) { [self capturePhoto]; return; } 方法。

添加:

    - (void) capturePhoto {

        ...SOME CODE...

        [_stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error)
         {
             if(!CMSampleBufferIsValid(imageSampleBuffer))//Check if capture failed
             {
                 [self capturePhoto];
                 return;
             }

             ...SOME CODE...

         }];
    }

方法似乎是这样的:

{{1}}