ご存知のように、MPMoviePlayerControllerオブジェクトを使用して映画を再生します
[[MPMoviePlayerController alloc] initWithContentURL: aURL];
ここで、AlgorithmDESによって暗号化されたムービーソースを復号化するカスタムNSURLProtocolを実現したいと思います。その可能性はありますか?アイデアを出してくれてありがとう。助けが必要です〜
ご存知のように、MPMoviePlayerControllerオブジェクトを使用して映画を再生します
[[MPMoviePlayerController alloc] initWithContentURL: aURL];
ここで、AlgorithmDESによって暗号化されたムービーソースを復号化するカスタムNSURLProtocolを実現したいと思います。その可能性はありますか?アイデアを出してくれてありがとう。助けが必要です〜
更新:私はこれについてAppleに話しましたが、現時点ではMPMoviePlayerControllerをNSURLProtocolサブクラスで使用することはできません!
ヘイ、
よくわかりませんが、可能かもしれません。私は現在同様の作業を行っていますが、完全には機能していません。私が見つけたのは、MPMoviePlayerControllerがカスタムNSURLProtocolサブクラスと対話することですが、MPMoviePlayerControllerが必要とするバイトの範囲を定義するため、NSURLRequestのHTTPHeadersを考慮することが重要であるようです。
それらをNSURLProtocolサブクラスにダンプすると、最初に次のようなものが2回取得されます。
2011-01-16 17:00:47.287 iPhoneApp[1177:5f03] Start loading from request: {
Range = "bytes=0-1";
}
だから私の推測では、正しい範囲を提供し、MPMoviePlayerControllerで再生できるmp4ファイルを返すことができる限り、それは可能であるはずです!
編集:ここに興味深いリンクがあります:iPhoneおよびiPadアプリのリソースを保護する
解決策は、ローカルHTTPサーバーを介してリクエストをプロキシすることです。私はCocoaHTTPServerを使用してこれを達成しました。
例を見てくださいHTTPAsyncFileResponse
。
iOS7の時点でもう1つの解決策があります。AVAssetResourceLoaderDelegateをAVAssetResourceLoaderに使用できます。ただし、これはAVPlayerでのみ機能します。
AVARLDelegateDemoと呼ばれるアップルによるデモプロジェクトがあります。それを見て、必要なものを見つける必要があります。(リンクするのは良い考えではないので、developer.apple.comのDeveloper Libraryで検索してください)次に、カスタムURLスキームを使用して(NSURLProtocolを宣言せずに)、AVAssetResourceLoaderDelegateでそのURLスキームを処理します。
大きな関心があれば、概念実証の要点を提供できます。
@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
を使用するためにダミーURLを使用していることに注意してください。AVAssetResourceLoaderDelegate