Метод делегата на AVContentKeySessionDelegate не вызывается - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь воспроизвести зашифрованный поток HLS с помощью AVContentKeySession, но не удается воспроизвести, и в журналах отображается сообщение «NSURLConnection завершено с ошибкой - код -1002». Методы делегата в AVContentKeySessionDelegate не вызываются AVFoundation.

Я могу успешно воспроизвести тот же поток, если я установлю загрузчик ресурсов для медиаресурса.

Я пытаюсь воспроизвести следующее

NSString *mediaUrl = [[NSUserDefaults standardUserDefaults] objectForKey:@"media_url"];
AVURLAsset *avUrlAsset = (AVURLAsset*)[AVAsset assetWithURL:[NSURL URLWithString: mediaUrl]];
AVContentKeySession  *contentKeySession = [AVContentKeySession contentKeySessionWithKeySystem:AVContentKeySystemFairPlayStreaming];
[_contentKeySession setDelegate:[[PlaybackContentKeySessionDelegate alloc] init] queue:dispatch_get_main_queue()];
[_contentKeySession processContentKeyRequestWithIdentifier:@"skd://my_asset_id" initializationData:nil options:nil];
[playbackContentKeySession.contentKeySession addContentKeyRecipient:avUrlAsset];
avUrlAsset.resourceLoader.preloadsEligibleContentKeys = true;

AVPlayerItem *avPlayerItem = [AVPlayerItem playerItemWithAsset:avUrlAsset];

AVPlayer *avPlayer = [[AVPlayer alloc] initWithPlayerItem:avPlayerItem];

self.avPlayerViewController.player = avPlayer;

__weak ViewController *vc = self;
[self presentViewController:self.avPlayerViewController animated:YES completion:^(){
    vc.avPlayerViewController.player play];
}];

где класс делегата выглядит следующим образом. Он неполный, но на данном этапе я просто хочу увидеть, как вызывается метод делегата.

@interface PlaybackContentKeySessionDelegate : NSObject<AVContentKeySessionDelegate>

@end

- (void)contentKeySession:(nonnull AVContentKeySession *)session didProvideContentKeyRequest:(nonnull AVContentKeyRequest *)keyRequest {
    NSLog(@"contentKeySession");
}

@end

Однако я вижу сообщение об ошибке, упомянутое выше. Обратите внимание, что если я установил допустимый resourceLoader, который может извлекать ключи, воспроизведение будет продолжаться без проблем.

1 Ответ

0 голосов
/ 06 июня 2019

Для всех, кто сталкивался с чем-то вроде этого: проблема заключалась в том, что ContentKeySession держит делегат в качестве слабой ссылки, как это принято для шаблона делегата, поэтому он был очищен. Я пнул себя, когда кто-то заметил это!

...