我正在尝试在我的服务器上播放 mp4 视频,我想同时将此视频缓存到磁盘。
我知道我可以只使用 2 个请求来执行此操作,一个用于下载另一个由 AVPlayer 创建的用于播放视频,但这会浪费网络带宽。
所以我只需要使用一个外部请求来下载数据并从 MyNSURLProtocol 中的 AVPlayer 捕获所有 NSURLRequest 并为它们手动创建 NSHTTPURLResponse 。
这是工作流程的样子:
AVPlayer <--> MyNSURLProtocol <--> mp4 over network.
通过使用 Charles,我可以看到 AVPlayer 在 Internet 上播放视频需要 2 个步骤。第一步是下载前 2 个字节,以了解整个视频文件的大小。以下请求将同时下载文件的不同部分。
所以 MyNSURLProtocol 所做的只是使用外部请求下载整个 mp4 文件,当有足够的数据时,它将创建发送到 AVPlayer 的响应(也是数据)。
这就是它为 2 字节请求创建和发送响应的方式。
NSMutableDictionary* headers = ... // Config the headers like this:
{
"Accept-Ranges" = bytes;
"Cache-Control" = public;
"Content-Length" = 2;
"Content-Range" = "bytes 0-1/6581417";
"Content-Type" = "video/3gpp";
Date = "Thu, 18 Apr 2013 08:34:35 GMT";
Expires = "Wed, 12 Feb 2014 08:34:35 GMT";
"Last-Modified" = "Tue, 16 Apr 2013 09:03:35 GMT";
"Connection" = Close;
Server = "gvs 1.0";
"X-Content-Type-Options" = nosniff;
}
NSHTTPURLResponse* response = [[NSHTTPURLResponse alloc] initWithURL:
self.request.URL statusCode:206 HTTPVersion:@"HTTP/1.1" headerFields:headers];
[self.client URLProtocol:self didReceiveResponse:response
cacheStoragePolicy:NSURLCacheStorageAllowed];
问题是AVPlayer 没有发送以下请求来获取实际数据,嗯......有什么线索吗?