未调用AVContentKeySessionDelegate上的委托方法

时间:2019-05-28 18:27:39

标签: avfoundation hls avcontentkeysession

我正在尝试使用AVContentKeySession播放加密的HLS流,但没有实现播放,并且在日志中看到“ NSURLConnection已完成,错误-代码-1002”。 AVContentation不会调用AVContentKeySessionDelegate上的委托方法。

如果我在媒体资产上设置了资源加载器,则可以成功播放相同的流。

我尝试如下播放

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,则播放不会出现任何问题。

2 个答案:

答案 0 :(得分:0)

我发现了问题。我正在使用的播放列表具有#EXT-X-VERSION:4。

docs起,只有> 7版本支持EXT-X-SESSION-DATA和EXT-X-SESSION-KEY(https://developer.apple.com/documentation/http_live_streaming/about_the_ext-x-version_tag

答案 1 :(得分:0)

对于遇到这种情况的其他任何人:问题是ContentKeySession将该委托作为弱引用保存,这与委托模式的常规做法相同,因此已被清理。 当有人发现它时我会踢自己!