カスタムnsurlprotocolを使用してURLで映画を再生する方法は?
-
10-10-2019 - |
質問
ご存知のように、MPMoviePlayerControllerオブジェクトを使用して映画を再生してください
[[MPMoviePlayerController alloc] initWithContentURL: aURL];
次に、アルゴリズムによって暗号化された映画ソースを復号化するカスタムnsurlprotocolを実現したいと思います。それは可能性ですか?アイデアを与えてくれてありがとう。あなたが助けてくれる〜
解決
アップデート: 私はこれについてAppleに話をしましたが、現在MPMoviePlayerControllerを使用することは不可能です。
hej、
よくわかりませんが、可能性があります。私は現在、似たようなことに取り組んでいますが、完全に機能していません。私が見つけたのは、MPMoviePlayerControllerが私のカスタムNSURLProtoColサブクラスと対話することですが、MPMoviePlayerControllerのニーズを定義するため、NsurlRrequestの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
例。
iOS 7にはもう1つのソリューションがあります。AvassetResouroAderDeLegateを使用することができます。しかし、これはAvplayerでのみ機能します。
Avarldelegatedemoと呼ばれるAppleによるデモプロジェクトがあります。それを見て、必要なものを見つける必要があります。 (それにリンクすることは良い考えではないと思うので、Developer.Apple.comの開発者ライブラリでそれを検索してください)次に、カスタム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
使用するには AVAssetResourceLoaderDelegate
URLに直接アクセスする代わりにメソッド。