AVPlayer.addPeriodicTimeObserver эквивалент на AVAudioPlayerNode

#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  )  }  }