2010-12-08 2 views
8

Как вы знаете, играть в кино с объектом MPMoviePlayerController использованиемКак играть в фильм с URL-адресом, используя пользовательский NSURLProtocol?

[[MPMoviePlayerController alloc] initWithContentURL: aURL]; 

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

+1

Привет, Я хочу реализовать такую ​​же функцию, как вы. У меня есть файл с зашифрованным видео на сервере. и я хочу воспроизвести одно и то же видео с потоковой передачей. Как это возможно? Спасибо – Developer 2013-09-03 05:38:40

ответ

13

UPDATE: Я говорил с 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, это должно быть возможно!

EDIT: Вот интересная ссылка: Protecting resources in iPhone and iPad apps

+0

Я узнаю, что игроку нужен собственный синтаксический анализатор, он не может работать так, как будто я нахожу способ игрока разобрать URL-адрес, но яблоко не предоставило нам его. – ben 2011-01-20 04:33:14

+0

Я не вижу никаких методов в NSURLProtocol, которые содержат эту пользовательскую начальную загрузку с диапазоном. Вероятно, частный метод. Кто-нибудь знает об этом? – BadPirate 2011-03-31 22:45:03

+0

В методе startLoading вашего подкласса NSURLProtocol `NSDictionary * headers = [self.request allHTTPHeaderFields]; , если ([[заголовки AllKeys] containsObject: @ "Диапазон"]) \t { \t \t NSLog (@ "Range:% @", [заголовки objectForKey: @ "Диапазон"]); \t} ` – 2011-04-12 05:52:09

6

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

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

5

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

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

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

1
@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 напрямую.

Смежные вопросы