使用AVPlayer定时元数据

Nic*_*ung 6 ios avplayer swift

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

Nic*_*ung 12

显然,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.
    }
}
Run Code Online (Sandbox Code Playgroud)


Ohi*_*ovr 5

Nicolas Young的答案是正确的,它只需要进行一些小改动即可使用Swift3。有一些红色的感叹号,所以现在我对键值观察有了更好的了解,我终于想出了解决方法

import UIKit
import MediaPlayer

//from the original
///sf/answers/1964041411/

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.
}
}
Run Code Online (Sandbox Code Playgroud)