Ios 从新URL播放视频,无需创建新的AVPlayer对象

Ios 从新URL播放视频,无需创建新的AVPlayer对象,ios,swift,Ios,Swift,我正试图让用户能够循环浏览视频,在不刷新视图的情况下动态更改AVPlayer URL。然而,现在我只是在每次播放视频时实例化AVPlayer对象(导致音频彼此播放),我觉得这不是最好的方法。有没有一种更有效的方法类似于在imageView中更改图像 这是我播放剪辑的代码: player = AVPlayer(URL: fileURL) playerLayer = AVPlayerLayer(player: player) playerLayer!.frame = self.view.bounds

我正试图让用户能够循环浏览视频,在不刷新视图的情况下动态更改AVPlayer URL。然而,现在我只是在每次播放视频时实例化AVPlayer对象(导致音频彼此播放),我觉得这不是最好的方法。有没有一种更有效的方法类似于在imageView中更改图像

这是我播放剪辑的代码:

player = AVPlayer(URL: fileURL)
playerLayer = AVPlayerLayer(player: player)
playerLayer!.frame = self.view.bounds
self.view.layer.addSublayer(playerLayer!)
player!.play()

我可以通过这样做来完成你想要的

我有一个歌曲名称的表格视图,mp3文件存储在Parse.com上。在
didselectrowatinexpath
中,我确实

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    SelectedSongNumber = indexPath.row
    grabSong()
}


   func grabSong () {

    let songQuery = PFQuery(className: "Songs")
    songQuery.getObjectInBackgroundWithId(iDArray[SelectedSongNumber], block: {
        (object: PFObject?, error : NSError?) -> Void in


        if let audioFile = object?["SongFile"] as? PFFile {
            let audioFileUrlString: String = audioFile.url!
            let audioFileUrl = NSURL(string: audioFileUrlString)!

            myAVPlayer = AVPlayer(URL: audioFileUrl)
            myAVPlayer.play()

            currentUser?.setObject(audioFileUrlString, forKey: "CurrentSongURL")
            currentUser?.saveInBackground()
        }
    }) 
 }

当我运行它时,我选择一行,歌曲开始播放。如果我随后等待几秒钟并选择其他行,AVPlayer将播放我选择的新单元格中的歌曲,而不会播放一首歌曲。我的AVPlayer被声明为所有类都可以看到的公共变量

使用AVPlayerItem添加和删除AVPlayer对象的输出

创建AVPlayer时,不要将视频添加到AVPlayer,而是创建一个空的AVPlayer实例,然后使用AVPlayerItem类的addOutput方法添加视频

要删除视频并添加新视频,请使用AVPlayerItem类的removeOutput方法删除旧视频,然后再次使用addOutput方法插入新视频

示例代码可从苹果的开发者网站获得,网址为


如果我发布自己的代码,它也会提供同样的功能。

不要使用
AVPlayer

而是使用
AVQueuePlayer
,它允许您从队列中插入和删除项目

//create local player in setup methods
self.localPlayer = AVQueuePlayer.init()
要添加项目,只需使用

//optional: clear current queue if playing straight away
self.localPlayer.removeAllItems()

//get url of track
let url : URL? = URL.init(string: "http://urlOfItem")
if url != nil {
   let playerItem = AVPlayerItem.init(url: url!)

   //you can use the after property to insert 
   //it at a specific location or leave it nil
   self.localPlayer.insert(playerItem, after: nil)
   self.localPlayer.play()
}

AVQueuePlayer
支持
AVPlayer
的所有功能,但增加了从队列中添加和删除项目的功能。

全局创建AVPlayer实例,然后在希望从新URL播放新视频时再次覆盖它

正如我所说的,在创建之后不要访问AVPlayer对象;相反,只使用它的当前项。@詹姆斯布什确实你的方法更好。另一种选择是使用AVQueuePlayer,将所有可能的URL添加到AVPlayerItems数组中,然后将该数组插入队列并动态重新排序该数组。这将允许行中的下一个视频在上一个视频仍在播放时开始缓冲或:[self.player prerollatate:1.0 completionHandler:^(BOOL finished){[self.player play];[self.player setRate:1.0];}];我这样问是因为我无法在没有URL或AVAsset的情况下实例化AVPlayerItem。我将无法在设置AVPlayer的viewDidLoad中访问fileURL变量。请导入照片框架,然后在加载AVPlayerItem或AVAsset的任何位置使用[[PHImageManager defaultManager]请求…[选择playerItem或asset]@JamesBush你还是应该显示代码,即使这是苹果公司的你救了我一天。谢谢。
//create local player in setup methods
self.localPlayer = AVQueuePlayer.init()