我有一个按钮和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行设置断点时,它始终有效。
有什么想法吗?
答案 0 :(得分:0)
我也像你的那样打了这个问题。在我的情况下,AVPlayer
和AVPlayerLayer
位于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,这样我就可以(有点)确保我的图像(用于视频)至少会被缓存如果网络不良/慢速或网络中断。