Я знаю, что 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