2013-08-13 24 views
7

Die Dokumentation sagt über AVURLAsset.resourceLoader:Wie verwende ich AVAssetResourceLoader?

Beim Laden der Objektressourcenlader aufgefordert werden, in der das Laden einer Ressource zu unterstützen. Zum Beispiel kann eine Ressource, die eine Entschlüsselung erfordert, dazu führen, dass der Ressourcenlader aufgefordert wird, die geeigneten Entschlüsselungsschlüssel bereitzustellen. Sie können dem Ressourcenladeprogrammobjekt ein Delegatobjekt zuweisen und Ihren Stellvertreter verwenden, um diese Anforderungen abzufangen und eine entsprechende Antwort bereitzustellen.

Also, was ich versuche, in meinem Code zu tun ist:

NSURL* url = ...; 
_asset = [[AVURLAsset alloc] initWithURL:url options:nil]; 

AVAssetResourceLoader* loader = _asset.resourceLoader; 
[loader setDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)]; 

_playerItem = [AVPlayerItem playerItemWithAsset:_asset]; 
_player = [AVPlayer playerWithPlayerItem:_playerItem]; 

// ... setting up the player layer 

[_player play]; 

und auch in meiner Klasse I AVAssetResourceLoaderDelegate in @interface hinzufügen und auch Methode implementieren:

- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest 
{ 
    NSLog(@"YES"); 
    return YES; 
} 

Was auch immer URL wird übergeben, diese Methode wird nie aufgerufen. Wird nicht ausgeführt, wenn die URL ein gültiges Medium über HTTP ist oder mein benutzerdefiniertes registriertes NSURLProtocol verwendet wird.

Wann soll der ResourceLoader seinen Delegaten aufrufen?

Antwort

0

Sie müssen wahrscheinlich ersetzen Resource wie:

AVAssetResourceLoader* resource_loader = [some_AVAsset resourceLoader]; 
[resource_loader setDelegate:your_resource_data_loader queue:your_dispatch_queue]; 
+1

Falsch. Von Apple docs: * "Sie erstellen Ressourcenladerobjekte nicht selbst. Stattdessen rufen Sie einen Ressourcenlader aus der resourceLoader-Eigenschaft eines AVURLAsset-Objekts ab und verwenden es, um Ihr benutzerdefiniertes Delegatobjekt zuzuweisen." * –

+1

Und das ist genau so : AVAssetResourceLoader * resource_loader = [einige_AVAsset resourceLoader]; erstellt nichts neues, aber es wird resourceloader von avasset zurückgeben – Marcin

7

Sie versuchen, ein benutzerdefiniertes URL-Schema, zum Beispiel verwendet werden sollen: Statt http://myserver.com/listen.m3u Verwendung my_custom_scheme://myserver.com/listen.m3u. Standardmäßig wird HTTP & HTTPS von Apple behandelt, sodass der Delegat nicht aufgerufen wird. Um dies zu umgehen, müssen Sie ein benutzerdefiniertes Schema verwenden, um den Aufruf für die Delegate-Methoden zu erzwingen.