在看了这个问题之后: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()
答案 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)
否则其他在后台播放音乐的应用程序不会知道在您的会话结束后重新打开它们的音乐。