情侣问题与自定义相机

时间:2017-05-11 13:55:32

标签: swift swift3 camera avcapturesession avcapturedevice

我目前在我的应用程序中实现了自定义相机。我遇到了两个小问题。

1)当我切换b / w相机的视图(正面和背面)时,音频输入消失,只记录视频。

2)我决定哪个摄像机视图(正面和背面)是哪个,折旧,以及&我不知道如何解决它。对于这个,代码如下:折旧部分是设备存储为其变量。 xCode告诉我:“改用AVCaptureDeviceDiscoverySession。”

  let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) as! [AVCaptureDevice]

    // Get the front and back-facing camera for taking photos
    for device in devices {
        if device.position == AVCaptureDevicePosition.back {
            backFacingCamera = device

        } else if device.position == AVCaptureDevicePosition.front {
            frontFacingCamera = device
        }
    }
    currentDevice = backFacingCamera
    guard let captureDeviceInput = try? AVCaptureDeviceInput(device: currentDevice) else {
        return
    }

这里的一般摄像机录像是代码:

我的变量:

 let captureSession = AVCaptureSession()
        var currentDevice:AVCaptureDevice?
        var backFacingCamera: AVCaptureDevice?
        var frontFacingCamera: AVCaptureDevice?
        var videoFileOutput : AVCaptureMovieFileOutput?
        var cameraPreviewLayer : AVCaptureVideoPreviewLayer?
        @IBOutlet weak var recordingView: UIView!
切换相机:

 var device = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .back)
         func switchCameras() {
                captureSession.beginConfiguration()

                // Change the device based on the current camera
                let newDevice = (currentDevice?.position == AVCaptureDevicePosition.back) ? frontFacingCamera : backFacingCamera

                // Remove all inputs from the session
                for input in captureSession.inputs {
                    captureSession.removeInput(input as! AVCaptureDeviceInput)
                }

                // Change to the new input
                let cameraInput:AVCaptureDeviceInput
                do {
                    cameraInput = try AVCaptureDeviceInput(device: newDevice)
                } catch {
                    print(error)
                    return
                }

                if captureSession.canAddInput(cameraInput) {
                    captureSession.addInput(cameraInput)
                }

                currentDevice = newDevice
                captureSession.commitConfiguration()

                if currentDevice?.position == .front {
                    flashButton.isHidden = true
                    flashButton.isEnabled = false
                } else if currentDevice?.position == .back {
                    flashButton.isHidden = false
                    flashButton.isEnabled = true
                }

            }

&安培;在我看来会出现:

mediaViewCapture.frame = CGRect(x: self.view.frame.size.width * 0, y: self.view.frame.size.height * 0, width:self.view.frame.size.width, height: self.view.frame.size.height)
        self.view.addSubview(mediaViewCapture)

        captureSession.sessionPreset = AVCaptureSessionPresetHigh

        let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) as! [AVCaptureDevice]

        // Get the front and back-facing camera for taking photos
        for device in devices {
            if device.position == AVCaptureDevicePosition.back {
                backFacingCamera = device

            } else if device.position == AVCaptureDevicePosition.front {
                frontFacingCamera = device
            }
        }
        currentDevice = backFacingCamera
        guard let captureDeviceInput = try? AVCaptureDeviceInput(device: currentDevice) else {
            return
        }

        let audioInputDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeAudio)

        do
        {
            let audioInput = try AVCaptureDeviceInput(device: audioInputDevice)

            // Add Audio Input
            if captureSession.canAddInput(audioInput)
            {
                captureSession.addInput(audioInput)
            }
            else
            {
                NSLog("Can't Add Audio Input")
            }
        }
        catch let error
        {
            NSLog("Error Getting Input Device: \(error)")
        }

        videoFileOutput = AVCaptureMovieFileOutput()
        captureSession.addInput(captureDeviceInput)
        captureSession.addOutput(videoFileOutput)
        cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        view.layer.addSublayer(cameraPreviewLayer!)
        cameraPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
        cameraPreviewLayer?.frame = mediaViewCapture.layer.frame
        captureSession.startRunning()

&安培;最后我的捕获:

func capture(_ captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAt outputFileURL: URL!, fromConnections connections: [Any]!, error: Error!) {
    if error == nil {
        turnFlashOff()
        let videoVC = VideoPreviewVC()
        videoVC.url = outputFileURL
        self.navigationController?.pushViewController(videoVC, animated: false)
    } else {
        print("Error saving the video \(error)")
    }
    }

1 个答案:

答案 0 :(得分:1)

您可以查看使用AVCaptureDeviceDiscoverySession而不是AVCaptureDevice,因为以下是代码:

let deviceDiscovery = AVCaptureDeviceDiscoverySession(deviceTypes: [AVCaptureDeviceType.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .back)
        let devices = deviceDiscovery?.devices
        for device in devices! {
            if device.hasMediaType(AVMediaTypeVideo) {
                captureDevice = device
            }
        }

AVCaptureDeviceType具有以下类型:builtInMicrophone,builtInWideAngleCamera,builtInTelephotoCamera,builtInDualCamera和builtInDuoCamera。

切换相机时需要检查audioInput问题。