Как использовать AVPlayer addBoundaryTimeObserver? - PullRequest
0 голосов
/ 14 декабря 2018

Я записываю количество ударов в песне вручную, нажимая кнопку в пользовательском интерфейсе.

После этого, я хочу снова воспроизвести песню, звоните addBoundaryTimeObserver каждый раз, когда ключи arrayOfBeats соответствуют playerItem.currentTime

Как я могу подать ключи от 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 {$0}

    // 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

1 Ответ

0 голосов
/ 14 декабря 2018

Согласно документам

times - Массив объектов NSValue, содержащий CMTime значений, представляющих моменты времени, в которые вызывается блок.

Вам необходимо создать соответствующие CMTime структуры, а затем создать массив из NSValue объектов:

let cmtime = CMTime(seconds: 2.18, preferredTimescale: 100)
let cmtimevalue = NSValue(time: cmtime)
let cmtimevalueArray = [cmtimevalue]

Имейте в виду, что количество секунд для этого инициализатора равно Double, а timescale равно CMTimeScaleaka Int32

Также ваш arrayOfBeats - это не Array, это Dictionary, и элементы в словарях НЕ упорядочены.Вы, вероятно, не получите заказ, который искали.

Возможно, вам лучше обслужить массив кортежей.

let arrayOfBeats = [("2.18", 3), ("3.38", 5), ("3.63", 6)]

Преобразование значения String секунд обратно в Double - ваша (тривиальная) проблема.

...