Agregar AVCaptureDeviceInput a CaptureSession restablece / reenfoca el video.

Una aplicación de grabación de video. Quiero que funcione sin detener / pausar la música de background (cuando el usuario escucha Apple Music, por ejemplo). Esto puedo hacer muy bien con la configuration de la categoría para mixWithOthers con mixWithOthers en AVAudioSession singleton.

Después de configurar la categoría, también necesito agregar AVCaptureDeviceInput a AVCaptureSession (para que el audio se grabe). Esto provoca un fallo / hipo en el audio de background y también el video se reinicia / reenfoca.

He investigado y parece que el fallo de audio de background es algo que no se puede evitar, pero el video no debe reiniciarse cuando se agrega input. El resultado del restablecimiento de video es que el primer fotogtwig del video grabado es oscuro / negro o comienza con fuera del marco de enfoque y luego enfoca.

También se verificó la aplicación Snapchat ios y también tienen interferencias de audio al iniciar la grabación, pero el video comienza a grabar sin problemas. Qué estoy haciendo mal.

Mi código:

 //Setting audio session to mixWithOthers upon startup let session = AVAudioSession.shanetworkingInstance() do { try session.setCategory(AVAudioSessionCategoryPlayAndRecord, with: [.mixWithOthers]) if session.mode != AVAudioSessionModeVideoRecording { try session.setMode(AVAudioSessionModeVideoRecording) } } catch let error { print("avsession category error: \(error)") } 

Y entonces:

 //Just before recording starts will add audio input let audioDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeAudio) do { let deviceInput = try AVCaptureDeviceInput(device: audioDevice) as AVCaptureDeviceInput if captureSession.canAddInput(deviceInput) { captureSession.addInput(deviceInput) } else { print("Could not add audio device input to the session") } } catch let error as NSError { print(error.localizedDescription) return } 

¿Sería posible hacer esto sin ningún problema técnico? Si no, ¿cómo podría hacerlo al less como Snapchat (sin reiniciar el video en la llamada addInput)?

Noté que AVCaptureSession addInput restablece el silencio establecido por AVAudioSession AVAudioSessionCategory(Solo)Ambient Categoría AVAudioSession AVAudioSessionCategory(Solo)Ambient

  Category Silenced Interrupts AVAudioSessionCategoryAmbient Yes No AVAudioSessionCategorySoloAmbient Yes Yes AVAudioSessionCategoryMultiRoute No Yes AVAudioSessionCategoryPlayAndRecord No Yes AVAudioSessionCategoryPlayback No Yes AVAudioSessionCategoryRecord No Yes 

https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategoriesandModes/AudioSessionCategoriesandModes.html

Cuando el usuario mueve el interruptor Silent (o el interruptor Ring / Silent en el iPhone) a la position "silent", su audio se silencia.

AVAudioSessionCategoryAmbient : solo reproducción. Reproduce sonidos que agregan brillo o interés pero que no son esenciales para el uso de la aplicación. Usando esta categoría, su audio es silenciado por el interruptor de timbre / silencio y cuando la pantalla se bloquea.

AVAudioSessionCategorySoloAmbient – (Pnetworkingeterminado) Solo reproducción. Silencia el audio cuando el usuario cambia el interruptor de timbre / silencio a la position "silenciosa" y cuando la pantalla se bloquea. Esta categoría difiere de la categoría AVAudioSessionCategoryAmbient solo en que interrumpe otro audio.

Entonces, de su pregunta, esta oración específicamente:

El resultado del restablecimiento de video es que el primer fotogtwig del video grabado es oscuro / negro o comienza con fuera del marco de enfoque y luego enfoca.

Indica que está agregando la input de audioInput después de haber comenzado la grabación de video. ¿Es posible agregar el dispositivo de input de audioInput antes de que el video comience a grabar? Me imagino que se espera que el comportamiento del video se "congele" al agregar otra fuente de input, ya que AVCaptureSession esencialmente solo toma inputs y salidas de un file, más o less. Me imagino que agregar el dispositivo audioInput antes de la grabación resolvería ese problema en el producto final, ya que esa acción no terminaría en la grabación. 🙂

Otro comentario que se mencionó fue:

¿Estás llamando a beginConfiguration / commitConfiguration en la session antes de cambiar las inputs?

– SeanLintern88 10 de abr a las 15:30

Creo que esto no fue abordado por el autor de la pregunta, y también podría ser la causa de los problemas. Como se muestra en esta pregunta / respuesta , debe agregar el dispositivo de input de audioInput entre una llamada de begin/commit configuration .

En general, creo que los documentos básicos de Apple son muy útiles, y probablemente tenga más información para más cosas que es probable que desee hacer.