如何从mediaPickerController获取mediaItemCollection以在AVPlayer上播放?

时间:2016-02-13 14:38:11

标签: avfoundation avaudioplayer avplayer mpmediapickercontroller mpmediaitemcollection

在我回答这个问题的过程中,我在一本书中看到了这个问题。

“然而,MPMediaItem有一个MPMediaItemPropertyAssetURL键(或assetURL属性),其值为URL。这使您可以参考磁盘上的音乐文件,...获得了MPMediaItem的资产URL,您可以使用该URL初始化AVAudioPlayer,AVPlayer或AVAsset。“

所以我尝试使用mediaPickerController来获取这样的资产URL。

    func mediaPicker(mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {

    guard let mediaItem = mediaItemCollection.items.first else {
        NSLog("No item selected.")
        return
    }
    var songURL = mediaItem.valueForProperty(MPMediaItemPropertyAssetURL) as! NSURL
    print(songURL)
    self.dismissViewControllerAnimated(true, completion: nil)
}

在书中,它以此为例:

let arr = // array of MPMediaItem
let items = arr.map {
    let url = $0.assetURL!
    let asset = AVAsset(URL:url)
    return AVPlayerItem(asset: asset)
}
self.qp = AVQueuePlayer(items:items)
self.qp.play()

我不确定如何将mediaItemCollection转换为arr变量。 songURL和MediaItemCollection的使用在picker mediaPicker函数中。我不能在它的功能之外访问它。我如何让它工作?

1 个答案:

答案 0 :(得分:1)

行。我想出了这个。

解决方案是首先在函数之外声明变量,但在类之下。我刚刚创建了它:

class ViewController: UIViewController, MPMediaPickerControllerDelegate {

var songUrl: NSURL = NSURL()
var player = AVPlayer()


func mediaPicker(mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {

    guard let mediaItem = mediaItemCollection.items.first else {
        NSLog("No item selected.")
        return
    }
    songUrl = mediaItem.valueForProperty(MPMediaItemPropertyAssetURL) as! NSURL
    print(songUrl)

    self.dismissViewControllerAnimated(true, completion: nil)
}

现在我可以在函数外部访问songUrl。