AVCaptureSession和AVAudioSession录制视频,而背景音乐只播放一次

时间:2017-09-15 03:25:43

标签: ios swift avfoundation avcapturesession avaudiosession

在看了这个问题之后:AVAudioSession AVAudioSessionCategoryPlayAndRecord glitch,我试图尝试在背景音乐播放正常的情况下进行视频录制。录制开始时我会解决音频故障,当录制开始时,它会在第一次录制时正常工作。但如果我再次尝试录音,音乐就会停止。

任何想法为什么?

这是我的代码片段:

    captureSession = AVCaptureSession()
    captureSession?.automaticallyConfiguresApplicationAudioSession = false
    captureSession?.usesApplicationAudioSession = true

    guard let captureSession = self.captureSession else {
        print("Error making capture session")
        return;
    }

    captureSession.sessionPreset = AVCaptureSessionPresetHigh

    self.camera = self.defaultBackCamera()
    self.audioDeviceInput = try? AVCaptureDeviceInput(device: getAudioDevice())

    cameraInput = try AVCaptureDeviceInput(device: camera)
    captureSession.beginConfiguration()
    if captureSession.inputs.count > 0 {
        return
    }
    if captureSession.canAddInput(cameraInput) {
        captureSession.addInput(cameraInput)
        if captureSession.outputs.count == 0 {
            photoOutput = AVCapturePhotoOutput()
            if captureSession.canAddOutput(photoOutput!) {
                captureSession.addOutput(self.photoOutput!)
            }
    }
    captureSession.commitConfiguration()
    if !captureSession.isRunning {
        captureSession.startRunning()
        self.previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        self.previewLayer!.videoGravity = AVLayerVideoGravityResizeAspect
        self.previewLayer!.connection.videoOrientation = .portrait
        self.previewLayer!.frame = cameraView.layer.bounds
        self.cameraView.layer.addSublayer(self.previewLayer!)
        captureSession.beginConfiguration()
        videoFileOut = AVCaptureMovieFileOutput()
        if (captureSession.canAddOutput(videoFileOut)) {
            captureSession.addOutput(videoFileOut)
            if (videoFileOut?.connection(withMediaType: AVMediaTypeVideo).isVideoStabilizationSupported)! {
                videoFileOut?.connection(withMediaType: AVMediaTypeVideo).preferredVideoStabilizationMode = .cinematic
            }
        }
        captureSession.commitConfiguration()
    }

这是开始录制的代码:

    let audioSession = AVAudioSession.sharedInstance()
    try! audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord,
                                                    with: [.mixWithOthers, .allowBluetoothA2DP, .allowAirPlay])
    try! audioSession.setActive(true)
    captureSession?.beginConfiguration()
    if (captureSession?.canAddInput(audioDeviceInput!))! {
        captureSession?.addInput(audioDeviceInput!)
    }
    captureSession?.commitConfiguration()

并停止录制:

    let audioSession = AVAudioSession.sharedInstance()
    try! audioSession.setCategory(AVAudioSessionCategoryAmbient, with: [.mixWithOthers, .allowAirPlay])

    captureSession?.beginConfiguration()
    captureSession?.removeInput(audioDeviceInput)
    captureSession?.commitConfiguration()

3 个答案:

答案 0 :(得分:2)

我正在开展一个项目,我必须做几乎相同的事情:用背景音频播放录制视频。 (在Xamarin)

在我的代码中,我在onViewLoad中进行AudioSession设置。

在将catogory设置为PlayAndRecord之前,我也会执行audioSession.SetActive(false)。也许你应该在开始/停止录制时尝试这个。

贝努瓦

答案 1 :(得分:2)

在我看来,这与你的AVAudioSession有关。停止录制时,不要将audioSession设置为非活动状态。当您在开始新录制时更改AVAudioSession类别时,这会立即导致路由更改。

尝试停止录制时设置AVAudioSession无效。

不同的AVAudioSession类别对AirPlay有不同的影响。

获取

https://developer.apple.com/documentation/avfoundation/avaudiosession/audio_session_categories

音频会话类别AVAudioSessionCategoryPlayAndRecord仅支持AirPlay的镜像变体”和

仅音频会话回放类别(AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbient和AVAudioSessionCategoryPlayback)支持AirPlay的镜像和非镜像变体。

我建议在Apple文档中对AVAudioSession进行一点阅读,因为控制AVAudioSession本身有时需要经过深思熟虑。

https://developer.apple.com/documentation/avfoundation/avaudiosession

答案 2 :(得分:0)

记得在停用时使用 .notifyOthersOnDeactivation 标志调用 false:

try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)

否则其他在后台播放音乐的应用程序不会知道在您的会话结束后重新打开它们的音乐。

相关问题