录制时,将音频添加到我的视频中 - Swift 4



录制视频时,我正在尝试添加音频。我知道我必须在保存文件时单独记录并组合它们,但是我无法弄清楚该语法或在哪里添加音频设备以及在哪里组合文件。

可用的大多数信息都是基于旧的弃用语法或仅处理一个主题(视频,vs.音频等(

我有不同的功能来准备会话,显示会话并记录会话并保存基于" 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)
}

您无需单独保存音频并将其合并。您只需要在会话输入中添加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)
    }
}

使用AvcaptureVideDataOutput,AvcaptureaudiodataOutput和AvassetWriter类录制视频和音频的第二种方法,但有些复杂。如果您不需要实时更改视频或音频缓冲区,则最好使用AvcapturemoviefileOutput

最新更新