Как играть в фильм с URL -адресом с использованием пользовательского NSURLProtocol?
-
10-10-2019 - |
Вопрос
Как вы знаете, сыграйте фильм с объектом MpmoviePlayerController с использованием
[[MPMoviePlayerController alloc] initWithContentURL: aURL];
Теперь я хочу достичь пользовательского NSURLProtocol, в котором я расшифрую источник фильма, который был зашифрован по алгоритмам. Это возможность? Спасибо, что дали любые идеи. Вы помогите ~
Решение
ОБНОВИТЬ: Я поговорил с Apple об этом, и в данный момент невозможно использовать MpmoviePlayerController с подклассом NSURLProtocol!
Хедж,
Я не уверен, но это может быть возможно. В настоящее время я работаю над чем -то подобным, но не работал полностью. Что я узнал, так это то, что MpmoviePlayerController взаимодействует с моим пользовательским подклассом NSURLProtocol, но, похоже, важно принять во внимание Httphaders of the 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, взглянуть на него, и вы должны найти то, что вам нужно. (Я думаю, что ссылка на это не является хорошей идеей, поэтому просто найдите его в библиотеке разработчиков на разработчике. 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 напрямую.