如您所知,使用
使用MPMoviePlayerController对象播放电影[[MPMoviePlayerController alloc] initWithContentURL: aURL];
现在,我想实现一个自定义的NSURLProtocol,我将在其中解密已被AlgorithmDES加密的电影源。 那可能吗?感谢您提供任何想法。需要帮助〜
答案 0 :(得分:13)
更新:我与Apple谈到了这一点,目前无法将MPMoviePlayerController与NSURLProtocol子类一起使用!
HeJ小鼠,
我不确定但是有可能。我目前正在研究类似的东西,但还没有完全发挥作用。我发现MPMoviePlayerController与我的自定义NSURLProtocol子类进行交互但是考虑到NSURLRequest的HTTPHeaders似乎很重要,因为它们定义了MPMoviePlayerController需要的字节范围。
如果你将它们转储到你的NSURLProtocol子类中,你会得到两次这样的东西:
2011-01-16 17:00:47.287 iPhoneApp[1177:5f03] Start loading from request: {
Range = "bytes=0-1";
}
所以我的GUESS就是只要你能提供正确的范围并返回一个可以由MPMoviePlayerController播放的mp4文件就可以了!
编辑:这是一个有趣的链接:Protecting resources in iPhone and iPad apps
答案 1 :(得分:6)
解决方案是通过本地HTTP服务器代理请求。我使用CocoaHTTPServer完成了这项工作。
查看HTTPAsyncFileResponse
示例。
答案 2 :(得分:5)
从iOS 7开始还有一个解决方案。您可以为AVAssetResourceLoader使用AVAssetResourceLoaderDelegate。但这只适用于AVPlayer。
Apple有一个名为AVARLDelegateDemo的演示项目,看看它,你应该找到你需要的东西。 (我认为链接到它并不是一个好主意,所以只需在developer.apple.com上的Developer Library中搜索它)然后使用任何自定义URL方案(不声明NSURLProtocol)并在AVAssetResourceLoaderDelegate中处理该URL方案
如果有巨大的兴趣,我可以提供概念验证要点。
答案 3 :(得分:1)
@property AVPlayerViewController *avPlayerVC;
@property NSData *yourDataSource
// initialise avPlayerVC
NSURL *dummyURL = [NSURL URLWithString:@"foobar://dummy.mov"];// a non-reachable URL will force the use of the resourceLoader
AVURLAsset *asset = [AVURLAsset assetWithURL:dummyURL];
[asset.resourceLoader setDelegate:self queue:dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)];
AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:asset];
self.avPlayerVC.player = [AVPlayer playerWithPlayerItem:item];
self.avPlayerVC.player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
// implement AVAssetResourceLoaderDelegate
- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest {
loadingRequest.contentInformationRequest.contentType = (__bridge NSString *)kUTTypeQuickTimeMovie;
loadingRequest.contentInformationRequest.contentLength = self.yourDataSource.length;
loadingRequest.contentInformationRequest.byteRangeAccessSupported = YES;
NSRange range = NSMakeRange((NSUInteger)loadingRequest.dataRequest.requestedOffset, loadingRequest.dataRequest.requestedLength);
[loadingRequest.dataRequest respondWithData:[self.yourDataSource subdataWithRange:range]];
[loadingRequest finishLoading];
return YES;
}
请注意使用虚拟网址强制AVPlayer
使用AVAssetResourceLoaderDelegate
方法,而不是直接访问网址。