我知道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
答案 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