如何使用AVPlayer addBoundaryTimeObserver?
How to use AVPlayer addBoundaryTimeObserver?
我正在通过点击 UI 中的按钮手动记录歌曲的节拍数。
之后,每次 arrayOfBeats 的键与 playerItem.currentTime
匹配时,我想再次播放歌曲 addBoundaryTimeObserver
如何将 arrayOfBeats
的键输入到 addBoundaryTimeObserver
方法?
//save the time as a string with 2 decimal places
let timeString = String(format: "%.2f", strongSelf.timeInSeconds)
let arrayOfBeats = ["2.18": 3, "3.38": 5, "3.63": 6] // x.y seconds : beatCount
var timeObserverToken:Any!
func addBoundaryTimeObserver(url: URL) {
let playerItem = AVPlayerItem(url: url)
player = AVPlayer(playerItem: playerItem)
// Build boundary times from arrayOfBeats keys
let keys = arrayOfBeats.keys.compactMap {[=10=]}
// how can I convert keys to to NSValue as in https://developer.apple.com/documentation/avfoundation/avplayer/1388027-addboundarytimeobserver
var times = [NSValue]()
let mainQueue = DispatchQueue.main
player?.play()
timeObserverToken =
player?.addBoundaryTimeObserver(forTimes: times, queue: mainQueue) {
//update label with beatCount every time duration of audio file is transversed and it matches an element in var times = [NSValue]()
}
}//end addBoundaryTimeObserver
根据文档
times - An array of NSValue objects containing CMTime
values representing the times at which to invoke block.
您需要创建适当的 CMTime
结构,然后创建 NSValue
个对象的数组:
let cmtime = CMTime(seconds: 2.18, preferredTimescale: 100)
let cmtimevalue = NSValue(time: cmtime)
let cmtimevalueArray = [cmtimevalue]
请注意,此初始化程序的秒数是 Double
并且 timescale
是 CMTimeScale
又名 Int32
此外,您的 arrayOfBeats
不是 Array
,而是 Dictionary
,并且字典中的项目未排序。您可能得不到想要的订单。
使用元组数组可能会更好。
let arrayOfBeats = [("2.18", 3), ("3.38", 5), ("3.63", 6)]
将您的 String
秒值转换回 Double
是您的(微不足道的)问题。
我正在通过点击 UI 中的按钮手动记录歌曲的节拍数。
之后,每次 arrayOfBeats 的键与 playerItem.currentTime
addBoundaryTimeObserver
如何将 arrayOfBeats
的键输入到 addBoundaryTimeObserver
方法?
//save the time as a string with 2 decimal places
let timeString = String(format: "%.2f", strongSelf.timeInSeconds)
let arrayOfBeats = ["2.18": 3, "3.38": 5, "3.63": 6] // x.y seconds : beatCount
var timeObserverToken:Any!
func addBoundaryTimeObserver(url: URL) {
let playerItem = AVPlayerItem(url: url)
player = AVPlayer(playerItem: playerItem)
// Build boundary times from arrayOfBeats keys
let keys = arrayOfBeats.keys.compactMap {[=10=]}
// how can I convert keys to to NSValue as in https://developer.apple.com/documentation/avfoundation/avplayer/1388027-addboundarytimeobserver
var times = [NSValue]()
let mainQueue = DispatchQueue.main
player?.play()
timeObserverToken =
player?.addBoundaryTimeObserver(forTimes: times, queue: mainQueue) {
//update label with beatCount every time duration of audio file is transversed and it matches an element in var times = [NSValue]()
}
}//end addBoundaryTimeObserver
根据文档
times - An array of NSValue objects containing
CMTime
values representing the times at which to invoke block.
您需要创建适当的 CMTime
结构,然后创建 NSValue
个对象的数组:
let cmtime = CMTime(seconds: 2.18, preferredTimescale: 100)
let cmtimevalue = NSValue(time: cmtime)
let cmtimevalueArray = [cmtimevalue]
请注意,此初始化程序的秒数是 Double
并且 timescale
是 CMTimeScale
又名 Int32
此外,您的 arrayOfBeats
不是 Array
,而是 Dictionary
,并且字典中的项目未排序。您可能得不到想要的订单。
使用元组数组可能会更好。
let arrayOfBeats = [("2.18", 3), ("3.38", 5), ("3.63", 6)]
将您的 String
秒值转换回 Double
是您的(微不足道的)问题。