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.
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.
and then declare an extension of
AVPlayerItemMetadataCollectorPushDelegate
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:
To confirm, the above files should work fine with your code.