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.

Equivalente de AVPlayer.addPeriodicTimeObserver en AVAudioPlayerNode.

Estoy refactorizando un paquete de react-native que utiliza AVPlayer, por AVAudioEngine y AVAudioPlayerNode. Pero estoy confundido de cómo convertir AVPlayer.addPeriodicTimeObserver utilizando AVAudioPlayerNode. La idea es obtener datos de tiempo mientras se está reproduciendo la música, por lo que en esta función addPeriodicTimeObserver se necesita enviar un intervalo de manera periódica. Por lo tanto, ¿cómo usarlo en AVAudioPlayerNode, gracias?

func addPeriodicTimeObserver() {
    let timeScale = CMTimeScale(NSEC_PER_SEC)
    let time = CMTime(seconds: subscriptionDuration, preferredTimescale: timeScale)

    timeObserverToken = audioPlayer.addPeriodicTimeObserver(forInterval: time,
                                                            queue: .main) {_ in
        if (self.audioPlayer != nil) {
            self.sendEvent(withName: "rn-playback", body: [
                "isMuted": self.audioPlayer.isMuted,
                "currentPosition": self.audioPlayerItem.currentTime().seconds * 1000,
                "duration": self.audioPlayerItem.duration.seconds * 1000,
            ])
        }
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para usar AVAudioPlayerNode en lugar de AVPlayer en esta función, puedes hacer lo siguiente:

    1. Crear una instancia de AVAudioPlayerNode:
    let audioNode = AVAudioPlayerNode()
    
    1. Adjúntalo a tu AVAudioEngine:
    audioEngine.attach(audioNode)
    
    1. Conecta la salida de tu AVAudioPlayerNode a la entrada de tu AVAudioEngine:
    audioEngine.connect(audioNode, to: audioEngine.mainMixerNode, format: nil)
    
    1. Inicia tu AVAudioEngine:
    try! audioEngine.start()
    
    1. Programa el archivo de audio para que sea reproducido por tu AVAudioPlayerNode:
    audioNode.scheduleFile(audioFile, at: nil)
    
    1. Llama a addPeriodicTimeObserver en tu AVAudioPlayerNode en lugar de tu AVPlayer:
    let timeScale = CMTimeScale(NSEC_PER_SEC)
    let time = CMTime(seconds: subscriptionDuration, preferredTimescale: timeScale)
    
    timeObserverToken = audioNode.addPeriodicTimeObserver(forInterval: time,
                                                           queue: .main) {_ in
        let currentPosition = self.audioNode.currentTime * 1000
        let duration = self.audioFile.duration * 1000
        self.sendEvent(withName: "rn-playback", body: [
            "isMuted": self.audioNode.isMuted,
            "currentPosition": currentPosition,
            "duration": duration,
        ])
    }
    

    Ten en cuenta que en lugar de usar el método AVPlayerItem para obtener el tiempo actual y la duración, puedes usar las propiedades AVAudioPlayerNode currentTime y audioFile.duration. Además, asegúrate de eliminar el código relacionado con AVPlayer en tu función.

Comments are closed.