2

我正在尝试在我的服务器上播放 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 没有发送以下请求来获取实际数据,嗯......有什么线索吗?

4

1 回答 1

2

好的,最后我发现了这个: How to play movie with a URL using a custom NSURLProtocol?

似乎自定义 NSURLProtocol 不能与 AVPlayer 一起使用。所以我放弃了。

于 2013-04-23T03:38:00.880 回答