这是一个非常奇怪的错误。
我有一个tableView,每个单元格使用AVPlayer
从远程服务器流式传输视频(想想类似Vine的时间轴)。因此,当我滚动时,重新使用的单元格会使用新视频重新配置其播放器。
问题是:如果我来回滚动非常快,将相同的视频输入和移出屏幕,AVPlayer发送的请求最终会发生变化,包括HTTP标头If-None-Match
和{{1其余的时间都没有。它系统地使服务器返回If-Modified-Since
响应。
这似乎不能取悦AVPlayer的playerItem,它将状态更改为304 Not Modified
(有趣的是,AVPlayer的状态仍为AVPlayerItemStatusFailed
)。错误为AVPlayerStatusReadyToPlay
( - 11800),OSStatus -12983(未在任何地方记录,并且整个iOS SDK中没有标题)。
当它变得怪异时:无论我接下来做什么,AVPlayer及其playerItem都不可挽回地被烧毁。即使我用其他资产重新配置它们,它们也只会返回此状态并显示黑框。 Weirder仍然:即使我初始化另一个AVPlayer,AVPlayerItem 和 AVAsset,它也不会再玩了,我必须杀死并重新启动应用程序。
此时,我很无能为力。知道这里发生了什么吗?防止播放器在其连接中包含这些标头会修复它,但它不会暴露其请求序列化器。
答案 0 :(得分:0)
我遇到了304 Not Modified
响应,这是在AVPlayer重播相同视频并且AVPlayerItem.status
变成failed
时发生的,详细错误为content range mismatch - should be start 0 length 2 is start 0 length 1048575
。 但是,不同之处在于,如果AVPlayer
切换为播放其他视频,则播放是正常的。
详细的Http请求和响应示例:
索取零件
If-Modified-Since:Sat,24 Jun 2017 03:41:12 GMT
范围:字节= 0-1响应部分
HTTP / 1.1 304未修改
内容范围:字节0-1048575 / 13852554
解决方案:
修改服务器端逻辑,将Content-Range
的值更改为bytes 0-1/13852554
或直接删除Content-Range
,然后播放将正常开始。
答案 1 :(得分:0)
我遇到了同样的问题。因此我添加了If-None-Match: ${unique value}
标头以防止返回304。它对我有用。
var player = AVQueuePlayer()
func play(url: String) {
let headers = ["If-None-Match": "1"]
let options = ["AVURLAssetHTTPHeaderFieldsKey": headers]
let asset = AVURLAsset(url: URL(string: url)!, options: options)
let playItem = AVPlayerItem(asset: asset)
player.replaceCurrentItem(with: playItem)
player.automaticallyWaitsToMinimizeStalling = false
player.playImmediately(atRate: 1)
}