addPeriodicTimeObserver не вызывается каждую миллисекунду? - PullRequest
0 голосов
/ 10 декабря 2018

Я знаю, что player.currentItem.currentTime().seconds возвращает текущее время в секундах аудиофайла, который воспроизводится.

Можно ли добавить функцию обратного вызова на player, которая будет вызываться каждую миллисекунду?
Например, для секунды 1 эту функцию callBack следует вызывать 1000 раз.

Проблема в том, что при использовании addPeriodicTimeObserver функция callBack вызывается только 1 раз в секунду, а не 1000 раз в секунду.

Зачем мне это нужно?

1.
Я извлекаю количество ударов песни сальсы вручную, нажав на кнопкукнопку в пользовательском интерфейсе во время воспроизведения аудиофайла, и я записываю его как [Int:Int] // milisecondButtonTapped: beatCount.

Мой массив будет выглядеть как
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
...