用avfoundation捕捉图像

时间:2015-10-14 20:30:00

标签: ios swift

我正在使用AvFoundation作为相机。

这是我的实时预览:

enter image description here

看起来不错。当用户按下"按钮"我在同一个屏幕上创建快照。 (喜欢Snapchat)

我使用以下代码捕获图像并在屏幕上显示:

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

                        let imageDataJpeg = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageSampleBuffer)
                        let pickedImage: UIImage = UIImage(data: imageDataJpeg)!
                        self.captureSession.stopRunning()
                        self.previewImageView.frame = CGRect(x:0, y:0, width:UIScreen.mainScreen().bounds.width, height:UIScreen.mainScreen().bounds.height)
                        self.previewImageView.image = pickedImage
                        self.previewImageView.layer.zPosition = 100
}

用户捕获图像后,屏幕如下所示:

enter image description here

请查看标记区域。它没有在实时预览屏幕上查看(截图1)。

我的意思是实时预览并没有显示所有内容。但我确信我的实时预览效果很好,因为我与其他相机应用程序进行了比较,所有内容都与我的实时预览屏幕相同。我想我拍摄的图片有问题。

我正在使用以下代码创建实时预览:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    captureSession.sessionPreset = AVCaptureSessionPresetPhoto
    let devices = AVCaptureDevice.devices()
    for device in devices {
        // Make sure this particular device supports video
        if (device.hasMediaType(AVMediaTypeVideo)) {
            // Finally check the position and confirm we've got the back camera
            if(device.position == AVCaptureDevicePosition.Back) {
                captureDevice = device as? AVCaptureDevice
            }
        }
    }
    if captureDevice != nil {
        beginSession()
    }
}

func beginSession() {
    let err : NSError? = nil
    do {
        try captureSession.addInput(AVCaptureDeviceInput(device: captureDevice))
    } catch{

    }
    captureSession.addOutput(stillOutput)
    if err != nil {
        print("error: \(err?.localizedDescription)")
    }

    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    previewLayer?.videoGravity=AVLayerVideoGravityResizeAspectFill

    self.cameraLayer.layer.addSublayer(previewLayer!)
    previewLayer?.frame = self.cameraLayer.frame
    captureSession.startRunning()
}

我的cameraLayer

enter image description here

如何解决此问题?

2 个答案:

答案 0 :(得分:0)

据推测,您正在使用AVCaptureVideoPreviewLayer。所以听起来这个图层放置不正确或大小不正确,或者它有错误的AVLayerVideoGravity设置。部分图像不在屏幕上或裁剪;这就是为什么你在预览时看不到相机所看到的部分的原因。

答案 1 :(得分:0)

好的,我找到了解决方案。

我用过

#container {
    ...
    white-space: nowrap;
}

而不是

captureSession.sessionPreset = AVCaptureSessionPresetHigh

然后问题解决了。