#ios #swift #avaudioplayer #avaudioplayernode #react-native-bridge
#iOS #быстрый #аудиоплеер #аудиоплаернод #реагировать-родной-мост
Вопрос:
Я рефакторингую пакет react-native, который использует AVPlayer, в AVAudioEngine и AVAudioPlayerNode. Но я путаю, как включить AVPlayer.addPeriodicTimeObserver с помощью AVAudioPlayerNode. Идея в том, что мне нужно получать данные о времени, когда играет музыка, поэтому в этом закрытии addPeriodicTimeObserver нужно отправлять с интервалом, поэтому в этом отношении, как использовать его в режиме AVAudioPlayerNode, спасибо!
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, ]) } } }
Ответ №1:
Пожалуйста, попробуйте это, может быть, решите вашу проблему, currentTime сообщит avplayer текущую позицию
let timeScale = CMTimeScale(NSEC_PER_SEC) let time = CMTime(seconds: 0.01, preferredTimescale: timeScale) timeObserverToken = player.addPeriodicTimeObserver(forInterval: time, queue: .main) {_ in if (self.player != nil) { let currentTime = self.player.currentTime().seconds print("currentTime",currentTime) } }
Ответ №2:
В итоге я использовал таймер для наблюдения.
@objc(setupPlayer:rejecter:) func setupPlayer( resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock ) { ... do { try engine.start() startPlaybackTimer() } catch let err { ... } } @objc(updatePlaybackProgress:) public func updatePlaybackProgress(timer: Timer) -gt; Void { if player.isPlaying { let status = [ "currentPosition": getCurrentPos(), "duration": getCurrentDuration(), ] as [String : Any]; self.sendEvent(withName: "playbackData", body: status) } } @objc(startPlaybackTimer) func startPlaybackTimer() -gt; Void { DispatchQueue.main.async { self.timer = Timer.scheduledTimer( timeInterval: self.subscriptionDuration, target: self, selector: #selector(self.updatePlaybackProgress), userInfo: nil, repeats: true ) } }