Как воспроизвести фильм с URL, используя пользовательский NSURLProtocol? - PullRequest
8 голосов
/ 08 декабря 2010

Как вы знаете, воспроизводите фильм с помощью объекта MPMoviePlayerController, используя

[[MPMoviePlayerController alloc] initWithContentURL: aURL];

Теперь я хочу создать собственный NSURLProtocol, в котором я буду дешифровать источник фильма, который был зашифрован AlgorithmDES. Это возможность? спасибо за любые идеи. нужна ваша помощь ~

Ответы [ 4 ]

13 голосов
/ 16 января 2011

ОБНОВЛЕНИЕ: Я говорил об этом с Apple, и сейчас невозможно использовать MPMoviePlayerController с подклассом NSURLProtocol!


Hej,

IЯ не уверен, но это возможно.В настоящее время я работаю над чем-то похожим, но еще не получил его полностью.Я обнаружил, что 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

6 голосов
/ 14 января 2014

Решение - прокси-запросы через локальный HTTP-сервер. Я сделал это, используя CocoaHTTPServer .

Посмотрите на пример HTTPAsyncFileResponse.

5 голосов
/ 12 июня 2014

В iOS 7 есть еще одно решение. Вы можете использовать AVAssetResourceLoaderDelegate для AVAssetResourceLoader. Но тогда это будет работать только с AVPlayer.

Существует демонстрационный проект от Apple под названием AVARLDelegateDemo, посмотрите на него, и вы должны найти то, что вам нужно. (Я думаю, что ссылаться на него не очень хорошая идея, поэтому просто поищите его в библиотеке разработчика на developer.apple.com). Затем используйте любую пользовательскую схему URL (без объявления NSURLProtocol) и обрабатывайте эту схему URL в AVAssetResourceLoaderDelegate.

Если есть огромный интерес, я могу представить доказательство концепции.

1 голос
/ 29 ноября 2016
@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.

...