2010-12-08 7 views
8

Como saben, reproducir una película con objeto MPMoviePlayerController usandoCómo reproducir películas con una URL usando un NSURLProtocol personalizado?

[[MPMoviePlayerController alloc] initWithContentURL: aURL]; 

ahora, quiero lograr una costumbre NSURLProtocol en el que voy a descifrar una fuente de película que había ser cifrar por AlgorithmDES. ¿Es esa posibilidad? Gracias por dar ninguna ideas.need ayudas a ~

+1

Hola, quiero implementar la misma característica como usted.Tengo un archivo de video cifrado en el servidor. y quiero jugar el mismo video con transmisión. ¿Cómo es posible? Gracias – Developer

Respuesta

13

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 funcionando del todo. Lo que descubrí es que MPMoviePlayerController interactúa con mi subclase NSURLProtocol personalizada PERO parece importante tener en cuenta los HTTPHeaders de NSURLRequest porque definen un rango de bytes que el MPMoviePlayerController necesita.

Si les volcar en la subclase NSURLProtocol usted consigue algo como esto dos veces para el inicio:

2011-01-16 17:00:47.287 iPhoneApp[1177:5f03] Start loading from request: { 
Range = "bytes=0-1"; 

}

así que yo creo que el tiempo que usted puede proporcionar el rango correcto y devuelve un archivo mp4 que puede ser reproducido por MPMoviePlayerController, ¡debería ser posible!

EDIT: Aquí hay un enlace interesante: Protecting resources in iPhone and iPad apps

+0

descubro que el jugador necesita parse url por sí mismo, no podría funcionar como si encontrara la forma en que el jugador puede analizar la url, pero la manzana no nos lo daría. – ben

+0

No veo ningún método en NSURLProtocol que contenga este inicio personalizado cargando con rango. Probablemente un método privado. Alguien tiene una pista sobre esto? – BadPirate

+0

En el método startLoading de su subclase NSURLProtocol, llame al encabezados 'NSDictionary * = [self.request allHTTPHeaderFields]; si ([[cabeceras AllKeys] containsObject: @ "Range"]) \t { \t \t NSLog (@ "Rango:% @", [cabeceras objectForKey: @ "Range"]); \t} ' –

6

La solución es pasar peticiones a través de un servidor HTTP local. Lo he logrado usando CocoaHTTPServer.

Mire el ejemplo HTTPAsyncFileResponse.

+0

Voy a implementar un servidor local para la transmisión de video. Pero no sé cómo comenzar :(. ¿Podrían compartirme cómo crearlo? Muchas gracias – sahara108

+0

Probé el enfoque AVAssetResourceLoader y no puedo hacer que funcione. Parece que hay demasiado trabajo para algo simple (solo quiero encabezado personalizado en la solicitud URL de AVPlayer). ¿Puede proporcionar pautas sobre cómo implementar esto con CocoaHTTPServer? – mixtly87

5

Hay una solución más a partir de iOS 7. Puede utilizar un AVAssetResourceLoaderDelegate para AVAssetResourceLoader. Pero esto solo funcionará con AVPlayer entonces.

Hay un proyecto de demostración por Apple llamado AVARLDelegateDemo eche un vistazo y encontrará lo que necesita. (Creo que vincularlo no es una buena idea, así que simplemente búscalo en Developer Library en developer.apple.com) Luego usa cualquier esquema de URL personalizado (sin declarar un NSURLProtocol) y maneja ese esquema de URL en AVAssetResourceLoaderDelegate.

Si hay un gran interés podría proporcionar una prueba de concepto esencial.

+1

Combine esto con el AVPlayerViewController de iOS8 y esta es la mejor solución que he encontrado. Bien hecho para encontrar esto. –

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; 
} 

Aviso el uso de una dirección URL a la fuerza ficticia AVPlayer utilizar los métodos AVAssetResourceLoaderDelegate lugar de acceder a la URL directamente.

Cuestiones relacionadas