iOS:收到“304 Not Modified”响应时 AVPlayerItem 中的错误
Posted
技术标签:
【中文标题】iOS:收到“304 Not Modified”响应时 AVPlayerItem 中的错误【英文标题】:iOS: bug in AVPlayerItem when receiving `304 Not Modified` response 【发布时间】:2015-03-24 22:09:46 【问题描述】:这是一个非常奇怪的错误。
我有一个 tableView,每个单元格都使用 AVPlayer
从远程服务器流式传输视频(想想类似 Vine 的时间线)。因此,当我滚动时,被重复使用的单元格会使用新视频重新配置其播放器。
问题是:如果我快速来回滚动,让相同的视频进出屏幕,AVPlayer 发送的请求最终会改变,包括 HTTP 标头 If-None-Match
和 If-Modified-Since
,其中其余时间都不在那里。它系统地使服务器返回一个304 Not Modified
响应。
这似乎让 AVPlayer 的 playerItem 不满意,它将其状态更改为 AVPlayerItemStatusFailed
(有趣的是,AVPlayer 的状态仍然是 AVPlayerStatusReadyToPlay
)。错误是 AVErrorUnknown
(-11800) 和 OSStatus -12983 (在任何地方都没有记录,并且在整个 ios SDK 中没有标题)。
那是它变得奇怪的时候:无论我接下来做什么,AVPlayer 和它的 playerItem 都会被不可撤销地烧毁。即使我用其他资产重新配置它们,它们也只会返回此状态并显示黑框。更奇怪的是:即使我初始化了另一个 AVPlayer,AVPlayerItem 和 AVAsset,它也不会再播放了,我必须杀死并重新启动应用程序。
在这一点上,我很无知。知道这里发生了什么吗?阻止播放器在其连接中包含这些标头会修复它,但不会暴露其请求序列化程序。
【问题讨论】:
【参考方案1】:304 未修改
我遇到了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: 2017 年 6 月 24 日星期六 03:41:12 GMT 范围:字节=0-1
回复部分 HTTP/1.1 304 未修改 内容范围:字节 0-1048575/13852554
解决方案:
修改服务端逻辑,将Content-Range
的值改为bytes 0-1/13852554
或直接删除Content-Range
,即可正常播放。
【讨论】:
【参考方案2】:我遇到了同样的问题。所以我添加了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)
【讨论】:
以上是关于iOS:收到“304 Not Modified”响应时 AVPlayerItem 中的错误的主要内容,如果未能解决你的问题,请参考以下文章