Как играть в фильм с URL -адресом с использованием пользовательского NSURLProtocol?

StackOverflow https://stackoverflow.com/questions/4383388

Вопрос

Как вы знаете, сыграйте фильм с объектом 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 напрямую.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top