3

这是一个非常奇怪的错误。

我有一个 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、AVPlayerItemAVAsset,它也不会再播放了,我必须杀死并重新启动应用程序。

在这一点上,我很无知。知道这里发生了什么吗?阻止播放器在其连接中包含这些标头将修复它,但它不会暴露其请求序列化程序。

4

2 回答 2

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)
    }
于 2019-08-13T06:49:27.933 回答
0

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: Sat, 24 Jun 2017 03:41:12 GMT
Range:bytes=0-1

响应部分
HTTP/1.1 304 未修改
内容范围:字节 0-1048575/13852554

解决方法:
修改服务端逻辑,直接将Content-Rangevalue改为bytes 0-1/13852554或delete Content-Range,即可正常播放。

于 2018-12-27T09:07:56.097 回答