ChangbaDevs / KTVHTTPCache

A powerful media cache framework.
MIT License
2.35k stars 435 forks source link

[BUG] HTTP请求Range溢出导致无法播放视频 #90

Closed irobbin1024 closed 5 years ago

irobbin1024 commented 5 years ago

KTVHTTPCache 版本:1.1.7 KTVCocoaHTTPServer版本:1.0.0

我们最近遇到一个问题,播放的时候一直在loading,然后黑屏,无法播放,有时只有声音,没有画面。

最后会发生AVPlayer的AVPlayerItemStatusFailed错误,错误信息如下:

Printing description of error:

Error Domain=NSURLErrorDomain Code=-1001 "请求超时。" UserInfo={kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x280dff810 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <46862EF8-9F09-4D43-A377-DF118E00334A>.<25>, _NSURLErrorRelatedURLSessionTaskErrorKey=(

    "LocalDataTask <46862EF8-9F09-4D43-A377-DF118E00334A>.<25>"

), NSLocalizedDescription=请求超时。, NSErrorFailingURLStringKey=http://v4d.xiaoying.tv/20181129/zoXor9/3z9k4j8289.mp4, NSErrorFailingURLKey=http://v4d.xiaoying.tv/20181129/zoXor9/3z9k4j8289.mp4, _kCFStreamErrorDomainKey=4}

然后我跟踪上去,发现在 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 方法中会有错误回调,打印allHTTPHeaderFields结果如下:

(lldb) po task.currentRequest.allHTTPHeaderFields

{

    Accept = "/";

    "Accept-Encoding" = identity;

    "Accept-Language" = "zh-cn";

    Connection = "keep-alive";

    Range = "bytes=1321396-6766655";

    "User-Agent" = "AppleCoreMedia/1.0.0.16B92 (iPhone; U; CPU OS 12_1 like Mac OS X; zh_cn)";

}

请求的视频地址是:http://v4d.xiaoying.tv/20181129/zoXor9/3z9k4j8289.mp4 请求总内容大小是:1,176,941 字节 发生错误的请求Range:6,766,655

可以发现Range大小远远超过了原始数据大小,导致请求失败了。

此问题跟当前的缓存内容有关系,如果把本地所有缓存清楚,则第二次播放视频可以成功。

目前不是很容易复现,暂时只能提供这些信息,我将持续关注这个问题,提供更多信息。

libobjc commented 5 years ago

URL 对应的文件是否因服务端、CDN、302 等因素发生过变动?

6766655 取自之前的 Header。

有时只有声音,没有画面的情况也很像是数据不全来自同一文件。

irobbin1024 commented 5 years ago

@libobjc 感谢回复,经过排查,确实是服务端二次转码,压缩后但是地址没变,导致播放失败。