定时元数据与AVPlayer

你能控制AVURLAsset如何加载它需要的数据吗? 我需要添加一个自定义HTTP头( ICY-MetaData=1 ),似乎无法弄清楚如何。

显然, AVPlayer自动从Icecast请求元数据。 下面的代码完美的工作。

 class ViewController: UIViewController { var Player: AVPlayer! var PlayerItem: AVPlayerItem! override func viewDidLoad() { super.viewDidLoad() PlayerItem = AVPlayerItem(URL: NSURL(string: "http://live.machine.fm/aac")) PlayerItem.addObserver(self, forKeyPath: "timedMetadata", options: nil, context: nil) Player = AVPlayer(playerItem: PlayerItem) Player.play() } override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) -> Void { if keyPath != "timedMetadata" { return } var data: AVPlayerItem = object as AVPlayerItem for item in data.timedMetadata as [AVMetadataItem] { println(item.value) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

尼古拉斯杨的答案是正确的,只需要一些小的变化,与斯威夫特3一起工作。有一些红色的感叹号,所以现在我明白了关键价值观点,我终于想出了如何解决这个问题

 import UIKit import MediaPlayer //from the original //https://stackoverflow.com/a/28057734/1839484 class ViewController: UIViewController { var Player: AVPlayer! var PlayerItem: AVPlayerItem! override func viewDidLoad() { super.viewDidLoad() let playBackURL = URL(string: "http://ca2.rcast.net:8044/") PlayerItem = AVPlayerItem(url: playBackURL!) PlayerItem.addObserver(self, forKeyPath: "timedMetadata", options: NSKeyValueObservingOptions(), context: nil) Player = AVPlayer(playerItem: PlayerItem) Player.play() } override func observeValue(forKeyPath: String?, of: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if forKeyPath != "timedMetadata" { return } let data: AVPlayerItem = of as! AVPlayerItem for item in data.timedMetadata! { print(item.value!) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }