我正在尝试使用 AVContentKeySession 播放加密的 HLS 流,但没有实现播放,并且在日志中看到“NSURLConnection 完成错误 - 代码 -1002”。AVFoundation 没有调用 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
但是,我看到了上面提到的错误消息。请注意,如果我设置了一个可以获取密钥的有效资源加载器,则播放不会出现任何问题。