iOS边下边播的实现代码

  

项目中之前使用的是AVPlayer直接播放URL地址,但是不知道是相机的无线网络不够稳定还是代码的问题,应用总是出现缓冲卡顿,就考虑改写成边下边播的模式,查过了许多资料,发现大部分都是用的同一种方法
  

  

AVAssetResourceLoaderDelegate代理方法,来看看如何实现

  

首先要实现两个必须的代理方法

        AVAssetResourceLoaderDelegateObjective-C   # pragma马克- AVAssetResourceLoaderDelegate//开始加载   (保龄球)resourceLoader:(AVAssetResourceLoader *) resourceLoader shouldWaitForLoadingOfRequestedResource: (AVAssetResourceLoadingRequest *) loadingRequest {   (自我addLoadingRequest: loadingRequest);   返回YES;   }//取消加载   - (void) resourceLoader: (AVAssetResourceLoader *) resourceLoader didCancelLoadingRequest: (AVAssetResourceLoadingRequest *) loadingRequest {   (自我removeLoadingRequest: loadingRequest);   }   # pragma马克- AVAssetResourceLoaderDelegate//开始加载   (保龄球)resourceLoader:(AVAssetResourceLoader *) resourceLoader shouldWaitForLoadingOfRequestedResource: (AVAssetResourceLoadingRequest *) loadingRequest {   (自我addLoadingRequest: loadingRequest);   返回YES;   }//取消加载   - (void) resourceLoader: (AVAssetResourceLoader *) resourceLoader didCancelLoadingRequest: (AVAssetResourceLoadingRequest *) loadingRequest {   (自我removeLoadingRequest: loadingRequest);   }      

然后要定义一个下载类,其实就是分段下载数据的下载器

        AVAssetResourceLoaderDelegateObjective-C   - (void)开始{   NSMutableURLRequest *请求=[NSMutableURLRequest requestWithURL:(自我。requestURL originalSchemeURL] cachePolicy: NSURLRequestReloadIgnoringCacheData timeoutInterval RequestTimeout):;   如果(自我。requestOffset祝辞0){   [请求addValue: [NSString stringWithFormat: @“字节=% ld - % ld”,自我。requestOffset,自我。fileLength - 1] forHTTPHeaderField: @“范围”);   }   自我。会话=[NSURLSession sessionWithConfiguration:(NSURLSessionConfiguration defaultSessionConfiguration)委托:自我delegateQueue: [NSOperationQueue mainQueue]];   自我。任务=[自我。会话dataTaskWithRequest:请求);   (自我。工作简历);   }   # pragma马克- NSURLSessionDataDelegate//服务器响应   - (void) URLSession: (NSURLSession *)会话dataTask: (NSURLSessionDataTask *) dataTask didReceiveResponse: (NSURLResponse *)响应completionHandler: completionHandler(空白(^)(NSURLSessionResponseDisposition)) {   如果(self.cancel)返回;   SRQLog(@”回应:% @”,响应);   completionHandler (NSURLSessionResponseAllow);   NSHTTPURLResponse * httpResponse=(NSHTTPURLResponse *)反应;   NSString * contentRange=[[httpResponse allHeaderFields] objectForKey: @“含量”);   NSString * fileLength=[[contentRange componentsSeparatedByString: @ "/"] lastObject);   自我。fileLength=fileLength.integerValue比;0 & # 63;fileLength.integerValue: response.expectedContentLength;   如果(self.delegate,,(self.delegate respondstoselectorismemberofclass: @ selector (requestTaskDidReceiveResponse))) {   [self.delegate requestTaskDidReceiveResponse];   }   }//服务器返回数据可能会调用多次   - (void) URLSession: (NSURLSession *)会话dataTask: (NSURLSessionDataTask *) dataTask didReceiveData:数据(NSData *) {   如果(self.cancel)返回;//SRQLog(@“收到响应了:% @”,数据);   自我。cacheLength +=data.length;   如果(self.delegate,,(self.delegate respondstoselectorismemberofclass: @ selector (requestTaskDidUpdateCache))) {   [self.delegate requestTaskDidUpdateCache];   }   }//请求完成会调用该方法,请求失败则有误差值   - (void) URLSession: (NSURLSession *)会话任务:(NSURLSessionTask *)任务didCompleteWithError:错误(NSError *) {   如果(self.cancel) {   SRQLog(@”下载取消”);   其他}{   如果(错误){   如果(self.delegate,,(self.delegate respondstoselectorismemberofclass: @ selector (requestTaskDidFailWithError:))) {   [self.delegate requestTaskDidFailWithError错误):;   }   其他}{//可以缓存则保存文件   如果(self.cache) {   (文件句柄cacheTempFileWithFileName: [NSString fileNameWithURL: self.requestURL]];   }   如果(self.delegate,,(self.delegate respondstoselectorismemberofclass: @ selector (requestTaskDidFinishLoadingWithCache:))) {   [self.delegate requestTaskDidFinishLoadingWithCache self.cache):;   }   }   }   }      - (void)开始{   NSMutableURLRequest *请求=[NSMutableURLRequest requestWithURL:(自我。requestURL originalSchemeURL] cachePolicy: NSURLRequestReloadIgnoringCacheData timeoutInterval RequestTimeout):;   如果(自我。requestOffset祝辞0){   [请求addValue: [NSString stringWithFormat: @“字节=% ld - % ld”,自我。requestOffset,自我。fileLength - 1] forHTTPHeaderField: @“范围”);   }   自我。会话=[NSURLSession sessionWithConfiguration:(NSURLSessionConfiguration defaultSessionConfiguration)委托:自我delegateQueue: [NSOperationQueue mainQueue]];   自我。任务=[自我。会话dataTaskWithRequest:请求);   (自我。工作简历);   }   # pragma马克- NSURLSessionDataDelegate//服务器响应   - (void) URLSession: (NSURLSession *)会话dataTask: (NSURLSessionDataTask *) dataTask didReceiveResponse: (NSURLResponse *)响应completionHandler: completionHandler(空白(^)(NSURLSessionResponseDisposition)) {   如果(self.cancel)返回;   SRQLog(@”回应:% @”,响应);   completionHandler (NSURLSessionResponseAllow);   NSHTTPURLResponse * httpResponse=(NSHTTPURLResponse *)反应;   NSString * contentRange=[[httpResponse allHeaderFields] objectForKey: @“含量”);   NSString * fileLength=[[contentRange componentsSeparatedByString: @ "/"] lastObject);   自我。fileLength=fileLength.integerValue比;0 & # 63;null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

iOS边下边播的实现代码