AVCaptureSession y AVAudioSession graban video mientras que la reproducción de música de background solo funciona una vez

Después de ver esta pregunta: AVAudioSession AVAudioSessionCategoryPlayAndRecord glitch , traté de tomar una puñalada tratando de get la grabación de video con la reproducción de música de background funcionando correctamente. Me dirijo a la falla de audio cuando comienza la grabación, y cuando termina, y funciona bien la primera vez que ocurre la grabación. Pero si bash grabar de nuevo, la música se detendrá.

¿Alguna idea de por qué?

Aquí hay un fragment de mi código:

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).prefernetworkingVideoStabilizationMode = .cinematic } } captureSession.commitConfiguration() } 

Este es el código para comenzar a grabar:

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

Y para dejar de grabar:

  let audioSession = AVAudioSession.shanetworkingInstance() try! audioSession.setCategory(AVAudioSessionCategoryAmbient, with: [.mixWithOthers, .allowAirPlay]) captureSession?.beginConfiguration() captureSession?.removeInput(audioDeviceInput) captureSession?.commitConfiguration() 

Estoy trabajando en un proyecto en el que tengo que hacer casi lo mismo: grabar video con audio de background. (en Xamarin)

En mi código hago la configuration de AudioSession en onViewLoad.

También hago audioSession.SetActive (falso) antes de configurar la categoría para PlayAndRecord. Tal vez deberías probar esto al iniciar / detener la grabación.

Benoit

Me parece que esto tiene que ver con tu AVAudioSession . No se establece que la session de audio esté inactiva cuando se detiene la grabación. Esto resulta en un cambio de ruta inmediato cuando cambia la categoría AVAudioSession al iniciar una nueva grabación.

Intente configurar AVAudioSession inactivo al detener la grabación.

También diferentes categorías de AVAudioSession tienen un impacto diferente en AirPlay.

Obtenido de

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

" La categoría de session de audio AVAudioSessionCategoryPlayAndRecord admite solo la variante reflejada de AirPlay " y

" Las categorías de reproducción de solo session de audio (AVAudioSessionCategoryAmbient, AVAudioSessionCategorySoloAmbient y AVAudioSessionCategoryPlayback) son compatibles tanto con las variantes reflejadas como las no duplicadas de AirPlay " .

Recomiendo leer un poco sobre AVAudioSession en los documentos de Apple, ya que simplemente controlar la AVAudioSession sí misma a veces necesita estar muy bien pensado.

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