AVPlayer有时无法加载视频

时间:2017-03-23 11:51:09

标签: ios swift avplayer

我有一个按钮和AVPlayer。单击按钮后,我使用DBAttachmentPickerController录制视频,我想将其加载到AVPlayer。

在下面的功能中,我尝试加载它:

func refresh(attachmentInfo: AttachmentInfo) {
        self.videoLayer.player = nil
        if let url = attachmentInfo.url {
                self.player = AVPlayer(url: url) // line A
                self.videoLayer.player = self.player // line B
        }
}

在6/10的情况下,它运行正常,但有时视频无法加载到AVPlayer。

当我在A行和B行设置断点时,它始终有效。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我也像你的那样打了这个问题。在我的情况下,AVPlayerAVPlayerLayer位于tableview单元格中,这使问题变得更糟。但是,我使用的是返回实际视频网址的API,以及一个由视频的第一帧图片组成的图片网址。在tableview单元格逻辑中,我首先尝试将视频加载到AVPlayer,然后检查AVPlayer是否有.video资产,如果它没有,那么我只是加载将其他网址中的图片转换为UIView(当然使用UIImageView)和#34; Play"图像中心的按钮图像。当用户点击播放按钮时,选择器功能应尝试再次使用视频URL加载AVPlayer。如果视频加载且AVPlayer拥有资源,则play()只需return(并可能提醒用户视频无法加载)。

如果您没有视频第一帧的图像,只需使用占位符图像和按钮即可。

检查player是否有视频的方法 -

if player.currentItem?.asset.tracks(withMediaType: .video).count == 0{
   print("Oops! no video here")
   //load an image, and add a button here
}else{
   //do whatever needs to be done if video is available
}

不幸的是,除非你有一些可靠的网络代码,你可以在utility线程中下载视频并将其存储在缓存中,但除此之外还有其他许多工作可以完成。必须认识到用户的数据使用情况,产生过多的下载线程等。

对于UITableView单元格中的图像缓存,我使用了来自Github的SDWebImage library,这样我就可以(有点)确保我的图像(用于视频)至少会被缓存如果网络不良/慢速或网络中断。