我已经设法让 AVPlayer 与 AVAssetResourceLoaderDelegate 一起在 iOS 7 上播放 m4a 文件,但我无法在 iOS 上执行此操作6 .
- (BOOL)resourceLoaderAVAssetResourceLoader *)resourceLoader
shouldWaitForLoadingOfRequestedResourceAVAssetResourceLoadingRequest *)loadingRequest
委托(delegate)方法被以下请求调用:
2014-05-12 15:14:58.798 AVPlayer-Delegate[661:1103] Requested data: {
Range = "bytes=0-1";
"X-Playback-Session-Id" = "5B64BE4E-442A-4A37-9263-04D22CDBCB28";
}
我按要求返回了前两个字节,但委托(delegate)方法不再被调用。我试图在传递的响应对象中提供各种 header ,但没有帮助。
这是我的实现:
- (BOOL)resourceLoaderAVAssetResourceLoader *)resourceLoader
shouldWaitForLoadingOfRequestedResourceAVAssetResourceLoadingRequest *)loadingRequest
{
NSLog(@"Requested data: %@",
loadingRequest.request.allHTTPHeaderFields);
NSDictionary *headers = @{@"Content-Type": @"audio/x-m4a",
@"Accept-Ranges" : @"bytes",
@"Content-Length" : [NSString stringWithFormat"%d", 2],
@"Content-Range" : [NSString stringWithFormat"bytes 0-1/%d", self.fileData.length],
@"X-Playback-Session-Id" : loadingRequest.request.allHTTPHeaderFields[@"X-Playback-Session-Id"],
@"ETag" : @"TAG"};
NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:loadingRequest.request.URL statusCode:206 HTTPVersion"HTTP/1.1" headerFields:headers];
//NSURLResponse *response = [[NSURLResponse alloc] initWithURL:loadingRequest.request.URL MIMEType"audio/m4a" expectedContentLength:self.fileData.length textEncodingName"UTF-8"];
NSData *requestedData = [self.fileData subdataWithRange:NSMakeRange(0, 2)];
[loadingRequest finishLoadingWithResponse:response data:requestedData redirect:nil];
return YES;
}
如果能提供任何帮助,我将不胜感激。
谢谢。
Best Answer-推荐答案 strong>
AVAssetResourceLoaderDelegate 在 IOS 6 和 IOS 7 上的工作方式不同。参见 What's New in IOS 7.0
The AVAssetResourceLoaderDelegate protocol now supports loading of
arbitrary ranges of bytes from a media resource.
IOS7 之前的标准解决方法是使用本地 HTTP 服务器。参见示例 https://stackoverflow.com/a/21225985
关于ios - iOS 6 上的 AVAssetResourceLoaderDelegate 协议(protocol),我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/23612094/
|