2010-12-08 9 views
8

Wie Sie wissen, spielen einen Film mit MPMoviePlayerController Objekt mitWie Movie mit einer URL mit einem benutzerdefinierten NSURLProtocol wiedergeben?

[[MPMoviePlayerController alloc] initWithContentURL: aURL]; 

jetzt, ich möchte eine benutzerdefinierte erreichen NSURLProtocol, in dem ich einen Film Quelle entschlüsselt, die von AlgorithmDES verschlüsseln werden musste. Ist diese Möglichkeit? Vielen Dank für jede ideas.need geben Sie ~

+1

Hallo, Ich möchte die gleiche Funktion wie Sie implementieren.Ich habe Videodatei auf dem Server verschlüsselt. und ich möchte dasselbe Video mit Streaming abspielen. Wie kann es möglich sein? Danke – Developer

Antwort

13

UPDATE helfen: ich an Apple darüber gesprochen und es ist nicht möglich MPMoviePlayerController mit einer NSURLProtocol Unterklasse zur Zeit nutzen zu können!


Hej,

Ich bin nicht sicher, aber es könnte möglich sein. Ich arbeite gerade an etwas ähnlichem, aber habe es nicht voll funktionstüchtig. Was ich herausgefunden habe, ist, dass MPMoviePlayerController mit meiner benutzerdefinierten NSURLProtocol-Unterklasse interagiert, ABER es scheint wichtig zu sein, die HTTPHeaders von NSURLRequest zu berücksichtigen, da sie einen Bereich von Bytes definieren, den der MPMoviePlayerController benötigt.

Wenn Sie sie in Ihrer NSURLProtocol Unterklasse Dump werden Sie so etwas wie dies zweimal für den Start bekommen:

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

}

Also meine Vermutung ist, dass, solange Sie den richtigen Bereich zur Verfügung stellen können und eine MP4-Datei zurückgeben, die vom MPMoviePlayerController wiedergegeben werden kann, sollte es möglich sein!

EDIT: Hier ist ein interessanter Link: Protecting resources in iPhone and iPad apps

+0

Ich finde heraus, dass der Spieler url selbst analysieren muss, es könnte nicht funktionieren, als ob ich den Weg des Spielers finde, url zu parsen, aber der Apfel würde uns dafür nicht zur Verfügung stellen. – ben

+0

Ich sehe keine Methoden in NSURLProtocol, die diesen benutzerdefinierten Start enthalten, der mit Bereich geladen wird. Wahrscheinlich eine private Methode. Jeder hat eine Ahnung davon? – BadPirate

+0

Im startLoading Methode Ihrer NSURLProtocol Unterklasse Aufruf 'NSDictionary * headers = [self.request allHTTPHeaderFields]; if ([[headers AllKeys] containsObject: @ "Range"]) \t { \t \t NSLog (@ "Bereich:% @", [headers objectForKey: @ "Range"]); \t} ' –

6

Die Lösung ist Proxy-Anfragen über einen lokalen HTTP-Server. Ich habe dies unter Verwendung CocoaHTTPServer erreicht.

Schauen Sie sich das HTTPAsyncFileResponse Beispiel an.

+0

Ich werde einen lokalen Server für das Streaming von Video implementieren. Aber ich weiß nicht, wie :(zu starten. Könnten Sie mir bitte mitteilen, wie es zu erstellen. Vielen Dank – sahara108

+0

habe ich versucht, AVAssetResourceLoader Ansatz und kann es nicht zu arbeiten. Es scheint zu viel Arbeit für etwas einfaches (ich will nur benutzerdefinierte Header in AVPlayer URL Anfrage). können Sie Richtlinien, wie dies mit CocoaHTTPServer zu implementieren? – mixtly87

5

Es gibt eine weitere Lösung als iOS 7. Sie können ein AVAssetResourceLoaderDelegate für AVAssetResourceLoader verwenden. Aber das funktioniert dann nur mit AVPlayer.

Es gibt ein Demo-Projekt von Apple namens AVARLDelegateDemo einen Blick darauf werfen und Sie sollten finden, was Sie brauchen. (Ich denke, eine Verknüpfung ist keine gute Idee, suchen Sie einfach in der Entwicklerbibliothek unter developer.apple.com). Verwenden Sie dann ein beliebiges benutzerdefiniertes URL-Schema (ohne ein NSURLProtocol zu deklarieren) und bearbeiten Sie dieses URL-Schema in AVAssetResourceLoaderDelegate.

Wenn es ein großes Interesse gibt, könnte ich einen Beweis des Konzeptwesens liefern.

+1

Kombinieren Sie dies mit der iOS8 AVPlayerViewController und dies ist die beste Lösung, die ich gefunden habe. Nun für die Suche nach getan. –

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

Beachten Sie die Verwendung einer Dummy-URL AVPlayer zu zwingen, die AVAssetResourceLoaderDelegate Methoden anstelle von Zugriff auf die URL direkt zu verwenden.

Verwandte Themen