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-MatchIf-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 中的错误的主要内容,如果未能解决你的问题,请参考以下文章

304 not modified 缓存问题解决

304 Not Modified

防止Tomcat中的304 NOT MODIFIED响应

nginx 304 not modified 怎样解决

如何防止nginx中的“304 Not Modified”?

200 OK (from cache) 与 304 Not Modified