>source

AVContentKeySession을 사용하여 암호화 된 HLS 스트림을 재생하려고하는데 재생이되지 않고 로그에 "NSURLConnection finished with error-code -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

그러나 위에서 언급 한 오류 메시지가 나타납니다. 키를 가져올 수있는 유효한 resourceLoader를 설정하면 아무런 문제없이 재생이 진행됩니다.

  • 답변 # 1

    이와 같은 다른 사람에게는 문제가 있습니다. 문제는 ContentKeySession이 델리게이트 패턴의 기존 방식과 같이 델리게이트를 약한 참조로 유지하므로 정리되었습니다. 누군가가 그것을 발견했을 때 나는 내 자신을 차 버렸다!

관련 자료

  • 이전 mysql - 결 측값에 대해 NULL로 쿼리를 작성하는 방법
  • 다음 log4j2 특성 파일을 사용하여 각 실행에서 날짜 시간 소인이있는 로그 파일을 생성하는 방법