Как воспроизвести фильм с URL, используя пользовательский NSURLProtocol?
Как вы знаете, воспроизводите фильм с помощью объекта MPMoviePlayerController, используя
[[MPMoviePlayerController alloc] initWithContentURL: aURL];
Теперь я хочу создать собственный NSURLProtocol, в котором я буду расшифровывать источник фильма, который был зашифрован AlgorithmDES. Это возможность? спасибо за любые идеи. нужна помощь ~
4 ответа
ОБНОВЛЕНИЕ: Я говорил с Apple об этом, и в настоящее время невозможно использовать MPMoviePlayerController с подклассом NSURLProtocol!
Хей,
Я не уверен, но это возможно. В настоящее время я работаю над чем-то похожим, но еще не получил его полностью. Я обнаружил, что MPMoviePlayerController взаимодействует с моим пользовательским подклассом NSURLProtocol, но кажется важным принять во внимание HTTPHeaders заголовка NSURLRequest, поскольку они определяют диапазон байтов, необходимых для MPMoviePlayerController.
Если вы сбросите их в своем подклассе NSURLProtocol, вы получите что-то вроде этого дважды для начала:
2011-01-16 17:00:47.287 iPhoneApp[1177:5f03] Start loading from request: {
Range = "bytes=0-1";
}
Так что я УДЕЛЯЮ, что, пока вы можете предоставить правильный диапазон и вернуть файл mp4, который может быть воспроизведен MPMoviePlayerController, это должно быть возможно!
РЕДАКТИРОВАТЬ: Вот интересная ссылка: Защита ресурсов в приложениях iPhone и iPad
Решение состоит в том, чтобы прокси-запросы через локальный HTTP-сервер. Я сделал это с помощью CocoaHTTPServer.
Посмотрите на HTTPAsyncFileResponse
пример.
Есть еще одно решение с iOS 7. Вы можете использовать AVAssetResourceLoaderDelegate для AVAssetResourceLoader. Но тогда это будет работать только с AVPlayer.
Существует демонстрационный проект Apple под названием AVARLDelegateDemo, посмотрите на него, и вы должны найти то, что вам нужно. (Я думаю, что ссылаться на него не очень хорошая идея, поэтому просто найдите его в библиотеке разработчика на developer.apple.com). Затем используйте любую пользовательскую схему URL (без объявления NSURLProtocol) и обрабатывайте эту схему URL в AVAssetResourceLoaderDelegate.
Если есть огромный интерес, я мог бы представить доказательства концепции.
@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.