HLS Metadata ID3 tag not working

江枫思渺然 提交于 2020-01-01 08:50:10

问题


I have a list of audio URLs in a TableView, so every time I tapped on each cell on didSelectRowAt this method will be called

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()
    })
}

And based on the tutorials, I implemented 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")
    }
}

The problem is that timedMetadata is always nil. Help would be appreciated.


回答1:


Your code works fine, the reason of this problem is caused by an issue from the server side.

You can use this tool mp3tag to edit the audio file - add meta data tags and upload it to server.

As examples, you can try these audios included metadata tags:

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

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

To confirm, the above files should work fine with your code.




回答2:


This is another alternative because I found out the server was not using "timed metadata". Here is how we implemented on our end, for those who haven't found an answer. The backend is using Wowza Server.

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)

and then declare an extension of AVPlayerItemMetadataCollectorPushDelegate

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


来源:https://stackoverflow.com/questions/49663296/hls-metadata-id3-tag-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!