HLS Metadata ID3 tag not working

2020-07-06 05:40发布

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.

2条回答
Deceive 欺骗
2楼-- · 2020-07-06 06:20

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 {
             }
                     }
    }
查看更多
疯言疯语
3楼-- · 2020-07-06 06:28

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.

查看更多
登录 后发表回答