录制时在视频中添加音频-Swift 4

Bre*_*ski 2 avfoundation ios swift

录制视频时,我试图添加音频。我知道保存文件时必须单独记录并合并它们,但是我无法弄清楚语法或添加音频设备的位置以及合并文件的位置。

大部分可用信息基于较旧的过时语法,或者仅涉及一个主题(视频,音频等)。

我具有用于准备会话,显示会话和记录会话以及保存outputFile的不同功能,该文件类似于以下代码,该代码基于“ Zero2Launch”中的教程https://www.youtube.com/watch?v=7TqXrMnfJy8

但是对于我的一生,我无法弄清楚如何处理音频。

func setupCaptureSession() {
    captureSession.sessionPreset = AVCaptureSession.Preset.hd1920x1080
}

func setupDevice() {
    let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified)

    let devices = deviceDiscoverySession.devices

    for device in devices {
        if device.position == AVCaptureDevice.Position.back {
            backCamera = device
        } else if device.position == AVCaptureDevice.Position.front {
            frontCamera = device
        }
    }
    currentDevice = backCamera
}


func setupInputOutput() {
    do {
        let captureDeviceInput = try AVCaptureDeviceInput(device: currentDevice!)
        captureSession.addInput(captureDeviceInput)
        videoFileOutput = AVCaptureMovieFileOutput()
        captureSession.addOutput(videoFileOutput!)
    } catch {
        print(error)
    }
}

func setupPreviewLayer() {
    cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
    cameraPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
    cameraPreviewLayer?.frame = self.view.frame
    self.view.layer.insertSublayer(cameraPreviewLayer!, at: 0)
}

func startRunningCaptureSession() {
    captureSession.startRunning()
}

func recordVideo() {

    if !isRecording {
        isRecording = true

        UIView.animate(withDuration: 0.5, delay: 0.0, options: [.repeat, .autoreverse, .allowUserInteraction], animations: { () -> Void in
            self.recordButton.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
        }, completion: nil)

        let outputPath = NSTemporaryDirectory() + "output.mov"
        let outputFileURL = URL(fileURLWithPath: outputPath)
        videoFileOutput?.startRecording(to: outputFileURL, recordingDelegate: self)

    } else {
        isRecording = false

        UIView.animate(withDuration: 0.5, delay: 1.0, options: [], animations: { () -> Void in
            self.recordButton.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
        }, completion: nil)
        recordButton.layer.removeAllAnimations()
        videoFileOutput?.stopRecording()
    }
}

func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
    if error != nil {
        print(error)
        return
    }

    UISaveVideoAtPathToSavedPhotosAlbum(outputFileURL.relativePath, self, nil, nil)
}
Run Code Online (Sandbox Code Playgroud)

Jab*_*son 6

您无需单独保存音频并进行合并。您只需要将audioDeviceInput添加到会话输入中,AVCaptureMovieFileOutput将为您做所有事情。尝试更改setupInputOutput方法

func setupInputOutput() {
    guard let audioDevice = AVCaptureDevice.default(for: .audio) else { return }

    do {
        let captureDeviceInput = try AVCaptureDeviceInput(device: currentDevice!)
        let audioDeviceInput = try AVCaptureDeviceInput(device: audioDevice)

        captureSession.addInput(captureDeviceInput)
        captureSession.addInput(audioDeviceInput)

        videoFileOutput = AVCaptureMovieFileOutput()
        captureSession.addOutput(videoFileOutput!)
    } catch {
        print(error)
    }
}
Run Code Online (Sandbox Code Playgroud)

还有第二种使用AVCaptureVideoDataOutput,AVCaptureAudioDataOutput和AVAssetWriter类记录视频和音频的方法,但有点复杂。如果您不需要实时更改视频或音频缓冲区,最好使用AVCaptureMovieFileOutput