首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVPlayer.addPeriodicTimeObserver等价于AVAudioPlayerNode

AVPlayer.addPeriodicTimeObserver等价于AVAudioPlayerNode
EN

Stack Overflow用户
提问于 2021-12-01 11:46:32
回答 2查看 457关注 0票数 0

我正在将使用AVPlayer的react本机包重构为AVAudioEngine和AVAudioPlayerNode。但是,我混淆了如何使用AVPlayer.addPeriodicTimeObserver来转换AVAudioPlayerNode。这个想法是,我需要在音乐播放的时候获得时间数据,因此在这个addPeriodicTimeObserver闭包中需要用间隔发送,所以在这方面,如何在AVAudioPlayerNode上使用它,谢谢!

代码语言:javascript
复制
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,
            ])
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-06 04:09:57

最后我用计时器观察。

代码语言:javascript
复制
@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) -> Void {
    if player.isPlaying {
    
    let status = [
      "currentPosition": getCurrentPos(),
      "duration": getCurrentDuration(),
    ] as [String : Any];
    
      self.sendEvent(withName: "playbackData", body: status)
    }
  }

  @objc(startPlaybackTimer)
  func startPlaybackTimer() -> Void {
    DispatchQueue.main.async {
      self.timer = Timer.scheduledTimer(
        timeInterval: self.subscriptionDuration,
        target: self,
        selector: #selector(self.updatePlaybackProgress),
        userInfo: nil,
        repeats: true
      )
    }
  }
票数 0
EN

Stack Overflow用户

发布于 2021-12-01 12:40:38

请试试这个,可以解决您的问题,currentTime会告诉avplayer当前的位置。

代码语言:javascript
复制
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)
        
    }
    
    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70183617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档