Тег ID3 метаданных HLS не работает

у меня есть список звуковых URL-адресов в TableView, поэтому каждый раз, когда я нажимал на каждую ячейку на didSelectRowAt этот метод будет называться

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // Prepare Audio URL
    let audioUrl = URL(string: (channelSelected.audioUrl?.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed))!)
    let playerItem = AVPlayerItem(url: audioUrl!)
    playerItem.addObserver(self, forKeyPath: "timedMetadata", options: .new, context: nil)
    player = AVPlayer(playerItem: playerItem)
    playerViewController = AVPlayerViewController()
    playerViewController.player = player
    present(playerViewController, animated: true, completion: {
        self.playerViewController.player?.play()
    })
}

и на основе учебников, я реализовал observe value listener

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    print("keypath = (keyPath!)")
    let avPlayerItem: AVPlayerItem = object as! AVPlayerItem
    if let timedMetadata = avPlayerItem.timedMetadata {
        print("Timed metadata = (timedMetadata)")
    } else {
        print("Timed metadata nil")
    }
}

проблема в том, что timedMetadata - это всегда ноль. Помощь будет оценена по достоинству.

2 ответов


ваш код работает нормально, причина этой проблемы вызвана проблемой со стороны сервера.

вы можете использовать этот инструмент mp3tag с для редактирования аудиофайла-добавьте теги метаданных и загрузите их на сервер.

в качестве примеров, вы можете попробовать эти аудио теги метаданных входят:

http://ice1.somafm.com/groovesalad-128-mp3

https://developer.jwplayer.com/jw-player/demos/basic/audio-metadata/assets/index.m3u8

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


Это еще одна альтернатива, потому что я узнал, что сервер не использует "временные метаданные". Вот как мы реализовали с нашей стороны, для тех, кто не нашел ответа. Серверная часть использует сервер Wowza.

let playerItem = AVPlayerItem(url: audioUrl!)
let adID = AVMetadataItem.identifier(forKey: "X-TITLE", keySpace: .hlsDateRange)
let metadataCollector = AVPlayerItemMetadataCollector(identifiers: [adID!.rawValue], classifyingLabels: nil)
        metadataCollector.setDelegate(self, queue: DispatchQueue.main)
playerItem.add(metadataCollector)

а затем объявить расширение AVPlayerItemMetadataCollectorPushDelegate

    func metadataCollector(_ metadataCollector: AVPlayerItemMetadataCollector, didCollect metadataGroups: [AVDateRangeMetadataGroup], indexesOfNewGroups: IndexSet, indexesOfModifiedGroups: IndexSet) {
             for metadataGroup in metadataGroups {
                     for metadata in metadataGroup.items {
             }
                     }
    }