Possible de lire une video en utilisant une sous-class de NSURLProtocol, en utilisant MPMovieController ou AVFoundation?

J'essaie actuellement de lire une video sur une URL dont le schéma personnalisé est défini dans une sous-class personnalisée NSURLProtocol. Initialement, j'utilisais MPMoviePlayerController pour tenter de le faire, mais après avoir rencontré des problèmes et vérifié le débordement de la stack, j'ai trouvé que MPMoviePlayerController ne gère pas les sous-classs NSURLProtocol comme prévu.

Comment lire un film avec une URL en utilisant un protocole NSURL personnalisé?

En conséquence, j'ai décidé de regarder le cadre AVFoundation, cependant, il semble que cela ne semble pas fonctionner. Je voulais juste savoir si c'était possible, ou est-ce que j'essaie de traverser les murs?

En utilisant AVFoundation, l'approche que j'utilise est montrée ci-dessous. Il est probablement utile de mentionner que cela fonctionne lorsque vous utilisez une URL standard pour une video hébergée sur Internet, mais ne fonctionne pas avec le protocole NSURLProtocol personnalisé.

// this doesn't work //AVPlayer *player = [[AVPlayer alloc] initWithURL:[NSURL urlWithSsortingng:@"custom URL scheme"]]; // this works AVPlayer *player = [[AVPlayer alloc] initWithURL:[NSURL urlWithSsortingng:@"some url to video on remote server"]]; AVPlayerLayer *layer = [AVAVPlayerLayer playerLayerWithPlayer:player]; // configure the layer [self.view.layer addSublayer:layer]; [player play]; 

Y at-il quelque chose de différent qui devrait être fait afin de jouer à partir de la sous-class définie NSURLProtocol?

Récemment, j'ai réussi à faire fonctionner NSURLProtocol avec MPMoviePlayerController. Ceci est principalement utile car MPMoviePlayerController n'accepte qu'un NSURL, donc il ne nous a pas permis de passer des cookies ou des en-têtes (pour l'authentification). L'utilisation de NSURLProtocol a permis cela. Je pensais partager un code pour la communauté pour une fois.

Fondamentalement, en utilisant NSURLProtocol, nous pouvons intercepter la communication entre MPMoviePlayerController et la requête streamée, injecter des cookies en cours de route, ou éventuellement save le stream hors ligne, ou le replace par des videos de chat ect … Pour cela, vous devez créer une nouvelle class My extend NSURLProtocol:

MyURLProtocol.h:

 #import <Foundation/Foundation.h> @interface MyURLProtocol : NSURLProtocol + (void) register; + (void) injectURL:(NSSsortingng*) urlSsortingng cookie:(NSSsortingng*)cookie; @end 

MyURLProtocol.m:

 #import "MyURLProtocol.h" @interface MyURLProtocol() <NSURLConnectionDelegate> { NSMutableURLRequest* myRequest; NSURLConnection * connection; } @end static NSSsortingng* injectedURL = nil; static NSSsortingng* myCookie = nil; @implementation MyURLProtocol // register the class to intercept all HTTP calls + (void) register { [NSURLProtocol registerClass:[self class]]; } // public static function to call when injecting a cookie + (void) injectURL:(NSSsortingng*) urlSsortingng cookie:(NSSsortingng*)cookie { injectedURL = urlSsortingng; myCookie = cookie; } // decide whether or not the call should be intercepted + (BOOL)canInitWithRequest:(NSURLRequest *)request { if([[[request allHTTPHeaderFields] objectForKey:@"BANANA"] isEqualToSsortingng:@"DELICIOUS"]) { return NO; } return [[[request URL] absoluteSsortingng] isEqualToSsortingng:injectedURL]; } // required (don't know what this means) + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { return request; } // intercept the request and handle it yourself - (id)initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)cachedResponse client:(id<NSURLProtocolClient>)client { if (self = [super initWithRequest:request cachedResponse:cachedResponse client:client]) { myRequest = request.mutableCopy; [myRequest setValue:@"DELICIOUS" forHTTPHeaderField:@"BANANA"]; // add your own signature to the request } return self; } // load the request - (void)startLoading { // inject your cookie [myRequest setValue:myCookie forHTTPHeaderField:@"Cookie"]; connection = [[NSURLConnection alloc] initWithRequest:myRequest delegate:self]; } // overload didReceive data - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [[self client] URLProtocol:self didLoadData:data]; } // overload didReceiveResponse - (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse *)response { [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:[myRequest cachePolicy]]; } // overload didFinishLoading - (void)connectionDidFinishLoading:(NSURLConnection *)connection { [[self client] URLProtocolDidFinishLoading:self]; } // overload didFail - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { [[self client] URLProtocol:self didFailWithError:error]; } // handle load cancelation - (void)stopLoading { [connection cancel]; } @end 

usage:

 [MyURLProtocol register]; [MyURLProtocol injectURL:@"http://server/your-video-url.mp4" cookie:@"mycookie=123"]; MPMoviePlayerController* moviePlayer = [[MPMoviePlayerController alloc]initWithContentURL:@"http://server/your-video-url.mp4"]; [moviePlayer play];