Как воспроизвести фильм с 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.

Другие вопросы по тегам