不会每毫秒调用一次addPeriodicTimeObserver吗?

时间:2018-12-10 11:38:15

标签: swift avplayer avplayeritem

我知道player.currentItem.currentTime().seconds返回正在播放的音频文件的当前时间(以秒为单位)。

我可以在player上添加一个回调函数,以使其每毫秒被调用吗?
例如对于第二个1,此callBack函数应被调用1000次。

问题是使用addPeriodicTimeObserver时,每秒仅调用1次callBack函数,而不是每秒调用1000次。

我为什么需要这个?

1。
我正在播放音频文件时,通过在UI中点击一个按钮来手动提取Salsa歌曲的节拍计数,并将其记录为[Int:Int] // milisecondButtonTapped:beatCount。 < / p>

我的数组看起来像
var beatCounts = [982: 1, 2051: 2, 3006: 3, 5027: 5, 6011: 6, 7028: 7]

音频播放完毕后,我将得到一个包含BeatCounts的数组,该数组对应于player.currentItem.currentTime()的某些毫秒数

2。

现在,我想再次播放歌曲,并检查播放器currentTime(以毫秒为单位)是否== var beatCounts中的值之一

func checkCurrentTime(playerTimeMilliseconds: Int) {

  for (millisecond, beatCount) in beatCounts {
    if  playerTimeMilliseconds == millisecond {
       //show beatCount in label on UI 
     }
 }
}





func playSound(url: URL) {

    let playerItem: AVPlayerItem = AVPlayerItem(url: url)
    player = AVPlayer(playerItem: playerItem)


    try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    try! AVAudioSession.sharedInstance().setActive(true)
    player?.play()

    player?.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, 1000), queue: DispatchQueue.main, using: { [weak self] (CMTime) in

        print("cmtime is \(CMTime)")
      CMTime.value

        if self?.player?.currentItem?.status == .readyToPlay {

        }
    })

}//end playSound

1 个答案:

答案 0 :(得分:1)

您只需要以不同的方式使用forInterval,而时间单位将为0.001,则首选时间标度应与NSEC_PER_SEC配合使用,如下所述

让间隔:CMTime = CMTimeMakeWithSeconds(0.001,preferredTimescale:Int32(NSEC_PER_SEC))

player?.addPeriodicTimeObserver(forInterval: *interval*), queue:
.main) { [weak self] (CMTime) in