组件介绍
1.拦截播放数据请求
-
- url 从http->sreaming
url = [url streamingURL];
- 下载的时候 url 改回成http
NSURL *url = loadingRequest.request.URL;
-
- 设置代理
self.resourceLoaderDelegate = [XMGRemoteResourceLoaderDelegate new];
[asset.resourceLoader setDelegate:self.resourceLoaderDelegate queue:dispatch_get_main_queue()];
- 3.代理的响应
注册代理
<AVAssetResourceLoaderDelegate>
- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest {
NSLog(@"%@", loadingRequest);
- (void)resourceLoader:(AVAssetResourceLoader *)resourceLoader didCancelLoadingRequest:(AVAssetResourceLoadingRequest *)loadingRequest;
- 播放器需要两步
-
填写头部信息
- loadingRequest.contentInformationRequest.contentLength = totalSize;
- loadingRequest.contentInformationRequest.contentType = contentType;
- loadingRequest.contentInformationRequest.byteRangeAccessSupported = YES;
-
返回响应填充数据
- [loadingRequest.dataRequest respondWithData:subData];
-
完成请求
- [loadingRequest finishLoading];
-
2.数据处理
-
- 检测本地缓存是否存在, 如果存在, 则直接从本地缓存返回相应额信息
-
- 根据文件后缀名, 获取对应的mimeType
-
- 获取文件的总大小
-
- 获取数据并响应
-
- 完成请求
-
- 否则进行下载处理
-
- 判断是否正在下载, 如果没有, 则下载并返回
-
- 如果已经在下载, 判断是否需要重新下载, 如果需要, 则重新下载并返回
-
- 否则, 就处理保存在数组中的请求
- 并且在下载过程中, 不断的判断处理所有请求(通过代理回调)
- 关于所有请求的处理流程
-
- 给每个请求, 填充头部信息
-
- 计算填充区域
-
- 根据每个请求的区间, 填充数据
-
- 判断是否能够完全填充, 如果能, 则返回数据后, 结束这个请求
-
3.根据文件名获取mimeType
- 框架 #import <MobileCoreServices/MobileCoreServices.h>
- 函数
CFStringRef contentTypeCF = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef _Nonnull)(fileExtension), NULL);
4.demo
- 写完所有的练习后上传