7

ドキュメントには、AVURLAsset.resourceLoader について次のように記載されています。

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

したがって、コードでやろうとしていることは次のとおりです。

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

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

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

どのような URL が渡されても、このメソッドが呼び出されることはありません。URL が HTTP 経由の有効なメディアであるか、カスタム登録された NSURLProtocol を使用しているかどうかは問題ではありません。

resourceLoader はいつデリゲートを呼び出すと想定していますか?

4

2 に答える 2

9

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

于 2015-05-10T18:09:54.527 に答える
-1

おそらく、resourceLoader を次のように置き換える必要があります。

AVAssetResourceLoader* resource_loader = [some_AVAsset resourceLoader];
[resource_loader setDelegate:your_resource_data_loader queue:your_dispatch_queue];
于 2014-07-10T09:34:36.320 に答える