2013-08-13 9 views
7

ドキュメントがAVURLAsset.resourceLoaderについてこう述べています。ロード時にAVAssetResourceLoaderの使用方法は?

、リソースローダオブジェクトは、リソースのロードを支援するために求められることがあります。たとえば、復号化を必要とするリソースの場合、適切な復号鍵を提供するようにリソースローダーに求められる可能性があります。デリゲートオブジェクトをリソースローダーオブジェクトに割り当て、デリゲートを使用してこれらの要求をインターセプトし、適切な応答を提供することができます。

それでは、私は私のコードでやろうとしていることである:

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

とも私のクラスでは、私は@interfaceにAVAssetResourceLoaderDelegateを追加しても、メソッドを実装します。

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

何であれURLが渡されると、このメソッドは呼び出されません。 URLがHTTP経由の有効なメディアである場合、またはカスタム登録されたNSURLProtocolを使用している場合は、metterしません。

resourceLoaderはいつデリゲートを呼び出すのですか?

答えて

0

あなたはおそらく必要があるようresourceLoaderを置き換える:代わりにhttp://myserver.com/listen.m3u使用my_custom_scheme://myserver.com/listen.m3uの:

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

間違っています。 Apple docs:* "自分でリソースローダーオブジェクトを作成するのではなく、AVURLAssetオブジェクトのresourceLoaderプロパティからリソースローダーを取得し、これを使用してカスタムデリゲートオブジェクトを割り当てます。" * –

+1

それはどうしたのですか? :AVAssetResourceLoader * resource_loader = [some_AVAsset resourceLoader];新しいものは作成しませんが、avassetからresourceloaderを返します – Marcin

7

あなたは、たとえば、カスタムURLスキームを使用してみてください。デフォルトでHTTP & HTTPSはAppleによって処理されるため、デリゲートは呼び出されません。これを回避するには、カスタムスキームを使用してデリゲートメソッドを強制的に呼び出す必要があります。