iOS:收到“304 Not Modified”响应时AVPlayerItem中的错误

时间:2015-03-24 22:09:46

标签: ios avfoundation avplayer avasset avplayeritem

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

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

此时,我很无能为力。知道这里发生了什么吗?防止播放器在其连接中包含这些标头会修复它,但它不会暴露其请求序列化器。

2 个答案:

答案 0 :(得分: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
  范围:字节= 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)
    }