es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo iniciar la grabación de audio cuando la aplicación se ejecuta en segundo plano?

Estoy trabajando en la grabación de audio. Cuando la aplicación se ejecuta en primer plano, tengo que comenzar la grabación de audio y al ir al segundo plano, en ese momento la grabación de audio funciona bien.

Pero mi pregunta es cómo comenzar la grabación de audio cuando ya estoy en el segundo plano. Mi función de grabación de audio se activa de esta manera:

Tengo un dispositivo Bluetooth LE con botones y una aplicación iOS. Ambos están emparejados (dispositivo Bluetooth LE y el iPhone en el que se ejecuta la aplicación iOS) y la aplicación iOS está escuchando eventos en el dispositivo Bluetooth LE, como cuando se presiona un botón.

Ahora, cuando el usuario presiona un botón en el dispositivo Bluetooth LE, la aplicación iOS captura el evento y puedo ejecutar código incluso si la aplicación está en segundo plano, pero no puedo iniciar una grabación de voz.

Ya he habilitado los Modos en segundo plano:

Aquí está mi código para la grabación de audio:

func startRecording() {

    DispatchQueue.global(qos: .background).asyncAfter(deadline: DispatchTime.now(), qos: .background) {
        let audioFilename = self.getDocumentsDirectory().appendingPathComponent("recording.m4a")
        print("grabar audio \(audioFilename)")
        let settings = [
            AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
            AVSampleRateKey: 12000,
            AVNumberOfChannelsKey: 1,
            AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
        ]

        do {
            self.audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
            self.audioRecorder.delegate = self
            self.audioRecorder.record()
        } catch {
            self.finishRecording(success: false)
        }
    }
}

No puedo encontrar una solución adecuada para hacer eso, por favor sugiérame la manera adecuada de hacerlo, gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para grabación de audio cuando la aplicación está en segundo plano

    Si desea iniciar la grabación de audio cuando su aplicación ya está en segundo plano, debe utilizar el método beginBackgroundTask(expirationHandler:) proporcionado por la clase UIApplication. Este método le permite solicitar al sistema más tiempo para completar una tarea específica antes de que la aplicación se suspenda.

    Así es como puede modificar su función startRecording para grabar audio incluso cuando la aplicación está en segundo plano:

    func startRecording() {
        DispatchQueue.global(qos: .background).async {
            let audioFilename = self.getDocumentsDirectory().appendingPathComponent("recording.m4a")
            print("grabar Audio \(audioFilename)")
            let settings = [
                AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
                AVSampleRateKey: 12000,
                AVNumberOfChannelsKey: 1,
                AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
            ]
    
            do {
                self.audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
                self.audioRecorder.delegate = self
    
                // Solicitar tiempo adicional en segundo plano
                let session = AVAudioSession.sharedInstance()
                try session.setCategory(.playAndRecord, mode: .default, options: [])
                try session.setActive(true)
                let bgTask = UIApplication.shared.beginBackgroundTask(withName: "Audio Recording") {
                    // Finalizar la tarea si no se ha completado
                    UIApplication.shared.endBackgroundTask(bgTask)
                }
    
                // Comenzar a grabar audio
                self.audioRecorder.record()
    
            } catch {
                self.finishRecording(success: false)
            }
        }
    }
    

    En la función modificada, hemos agregado los siguientes pasos:

    1. Hemos configurado la categoría de la sesión de audio en .playAndRecord, lo cual permite que la aplicación grabe audio mientras está en segundo plano.
    2. Hemos solicitado que la sesión de audio esté activa.
    3. Hemos comenzado una tarea en segundo plano utilizando el método beginBackgroundTask(expirationHandler:) y la hemos nombrado “Audio Recording”.
    4. Hemos comenzado a grabar el audio.

    Cuando la aplicación está en segundo plano y el usuario presiona un botón en el dispositivo Bluetooth LE, su aplicación recibirá el evento y se llamará al método startRecording(). En este punto, la aplicación solicitará tiempo adicional para completar la grabación de audio antes de que sea suspendida por el sistema.

    Una vez que la grabación esté completa, no olvide finalizar la tarea en segundo plano llamando al método endBackgroundTask(_:).

Comments are closed.