2014-05-12 101 views
2

我设法得到AVPlayerAVAssetResourceLoaderDelegate合作播放iOS 7上的m4a文件,但我无法在iOS 6上播放。iOS 6上的AVAssetResourceLoaderDelegate协议

- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader 
shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest 

委托方法获取调用具有以下要求:

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"; 
} 

我回国前两个字节的要求,但委托方法永远不会再次调用。我试图在我传递的响应对象中提供各种标题,但它没有帮助。

这是我实现:

- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader 

shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)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; 

} 

我真的很感激它的任何帮助。

谢谢。

+0

你有没有找到解决这个问题?我在iOS 7设备上看到了相同的行为(仅请求前两个字节)。在前两个字节的初始请求后没有请求。 – Alexander

回答

1

AVAssetResourceLoaderDelegate工作在IOS 6和IOS 7.不同参见What's New in IOS 7.0

的AVAssetResourceLoaderDelegate协议现在支持的从媒体资源的字节 任意范围内与加载。

iOS7之前的标准解决方案是使用本地HTTP服务器。看例如https://stackoverflow.com/a/21225985

+0

那么,如果iOS 6上的AVAssetResourceLoaderDelegate协议不能用于加载任意字节范围,那么它的目的是什么?是否还有其他可能的使用场景?谢谢。 –