¿Cómo se juega película con una URL utilizando una costumbre NSURLProtocol?
-
10-10-2019 - |
Pregunta
Como saben, jugar una película con objeto MPMoviePlayerController utilizando
[[MPMoviePlayerController alloc] initWithContentURL: aURL];
Ahora, quiero lograr una costumbre NSURLProtocol en el que voy a descifrar una fuente de película que tenía ser cifrar por AlgorithmDES. Es esa posibilidad? Gracias por dar ninguna ideas.need que ayudan a ~
Solución
ACTUALIZACIÓN: hablé a Apple sobre esto y no es posible utilizar MPMoviePlayerController con una subclase NSURLProtocol en el momento
Hej,
No estoy seguro pero podría ser posible. Actualmente estoy trabajando en algo similar, pero no lo tengo completamente de trabajo. Lo que he descubierto es que interactúa con MPMoviePlayerController mi costumbre NSURLProtocol subclase pero parece ser importante para tomar la HTTPHeaders del NSURLRequest en cuenta, ya que definen una serie de bytes de las necesidades MPMoviePlayerController.
Si les volcar en su NSURLProtocol subclase obtendrá algo como esto dos veces por el principio:
2011-01-16 17:00:47.287 iPhoneApp[1177:5f03] Start loading from request: {
Range = "bytes=0-1";
}
Así que mi conjetura es que todo el tiempo que puede proporcionar el rango correcto y devolver un archivo MP4 que se pueden reproducir por el MPMoviePlayerController debería ser posible!
EDIT: Aquí hay un enlace interesante: protección de los recursos en el iPhone y el iPad aplicaciones
Otros consejos
La solución es solicitudes de proxy a través de un servidor HTTP local. He logrado esto mediante CocoaHTTPServer .
Mira el ejemplo HTTPAsyncFileResponse
.
Hay una solución más a partir de iOS 7. Se puede utilizar un AVAssetResourceLoaderDelegate para AVAssetResourceLoader. Pero esto sólo funciona con AVPlayer a continuación.
Hay un proyecto de demostración por Apple llamada AVARLDelegateDemo tienen una mirada en ella y usted debe encontrar lo que necesita. (Creo que enlazan con él no es una buena idea, por lo que sólo la buscan en el desarrollador Biblioteca de developer.apple.com) A continuación, utilice cualquier esquema de URL personalizada (sin declarar un NSURLProtocol) y mango de ese esquema URL en el AVAssetResourceLoaderDelegate.
Si hay un enorme interés que podría proporcionar una prueba de concepto GIST.
@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;
}
Aviso el uso de una dirección URL ficticia a la fuerza AVPlayer
utilizar los métodos AVAssetResourceLoaderDelegate
lugar de acceder a la URL directamente.