如何使用自定义NSURLProtocol来播放电影?

如您所知,使用MPMoviePlayerController对象播放电影

[[MPMoviePlayerController alloc] initWithContentURL: aURL]; 

现在,我想实现一个自定义的NSURLProtocol,我将解密已经由AlgorithmDESencryption的电影源。 那是可能性吗? 谢谢你提供任何想法。需要你帮忙〜

更新:我与苹果公司谈到了这一点,目前不能使用带有NSURLProtocol子类的MPMoviePlayerController!


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文件,它应该是可能的!

编辑:这是一个有趣的链接: 保护iPhone和iPad应用程序中的资源

解决scheme是通过本地HTTP服务器代理请求。 我已经完成了这个使用CocoaHTTPServer 。

看看HTTPAsyncFileResponse例子。

从iOS 7开始,还有一个解决scheme。您可以使用AVAssetResourceLoader的AVAssetResourceLoaderDelegate。 但是这只能在AVPlayer上使用。

有一个名为AVARLDelegateDemo的苹果演示项目看看它,你应该find你需要的东西。 (我认为链接到它不是一个好主意,所以只需在developer.apple.com上的开发者库中search它)然后使用任何自定义的URLscheme(没有声明NSURLProtocol)并处理AVAssetResourceLoaderDelegate中的URLscheme。

如果有巨大的兴趣,我可以提供一个概念certificate的要点。

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

注意使用虚拟URL来强制AVPlayer使用AVAssetResourceLoaderDelegate方法,而不是直接访问URL。