AVPlayer/播放、缓存、下载功能

2,169 阅读1分钟

组件介绍

image.png

1.拦截播放数据请求

    1. url 从http->sreaming
url = [url streamingURL];
  • 下载的时候 url 改回成http
NSURL *url = loadingRequest.request.URL;
    1. 设置代理
    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.数据处理

    1. 检测本地缓存是否存在, 如果存在, 则直接从本地缓存返回相应额信息
      1. 根据文件后缀名, 获取对应的mimeType
      1. 获取文件的总大小
      1. 获取数据并响应
      1. 完成请求
    1. 否则进行下载处理
      1. 判断是否正在下载, 如果没有, 则下载并返回
      1. 如果已经在下载, 判断是否需要重新下载, 如果需要, 则重新下载并返回
      1. 否则, 就处理保存在数组中的请求
      • 并且在下载过程中, 不断的判断处理所有请求(通过代理回调)
      • 关于所有请求的处理流程
          1. 给每个请求, 填充头部信息
          1. 计算填充区域
          1. 根据每个请求的区间, 填充数据
          1. 判断是否能够完全填充, 如果能, 则返回数据后, 结束这个请求

3.根据文件名获取mimeType

  • 框架 #import <MobileCoreServices/MobileCoreServices.h>
  • 函数
CFStringRef contentTypeCF = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef _Nonnull)(fileExtension), NULL);

4.demo

  • 写完所有的练习后上传