AVComposition でカスタム resourceLoader を使用する方法はありますか? AVURLAsset で resourceLoader を設定し、そのアセットで AVPlayerItem を作成すると、AVAssetResourceLoaderDelegate コールバックを取得します。しかし、AVComposition で同じ AVURLAsset を使用すると、デリゲート コールバックを取得できません。実際、アセットをコンポジションに挿入する呼び出しから戻ることはありません。
AVURLAsset で呼び出される AVAssetResourceLoaderDelegate メソッド:
NSURL* mungedURL = [self mungeURL:itemURL];
AVURLAsset* asset = [[AVURLAsset alloc] initWithURL:mungedURL options:nil];
[asset.resourceLoader setDelegate:self queue:dispatch_get_main_queue()];
self.playerItem = [AVPlayerItem playerItemWithAsset:asset];
AVComposition に挿入された AVURLAsset で呼び出されない AVAssetResourceLoaderDelegate メソッド:
NSURL* mungedURL = [self mungeURL:itemURL];
AVURLAsset* asset = [[AVURLAsset alloc] initWithURL:mungedURL options:nil];
[asset.resourceLoader setDelegate:self queue:dispatch_get_main_queue()];
AVMutableComposition* composition = [AVMutableComposition composition];
CMTimeRange timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration);
[composition insertTimeRange:timeRange ofAsset:asset atTime:kCMTimeZero error:nil];
self.playerItem = [AVPlayerItem playerItemWithAsset:composition];
(実際には、insertTimeRange:ofAsset:atTime:error でハングします。その時点で変更された URL からロードしようとしていると思いますが、デリゲートは使用していません。)
リソース ローダー デリゲートが呼び出されるように URL スキームを微調整するメソッド:
- (NSURL*)mungeURL:(NSURL*)url
{
NSURLComponents* components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
components.scheme = @"fake-scheme";
return [components URL];
}