Как я могу использовать AVAssetDownloadTask для загрузки зашифрованного FairPlay экземпляра AVURLAsset, который еще не транслировался? - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь использовать AVAssetDownloadTask для загрузки и воспроизведения зашифрованного аудиосодержимого FairPlay в автономном режиме.Я продолжал получать такую ​​ошибку в urlSession:task:didCompleteWithError::

Error Domain = AVFoundationErrorDomain Code = -11863 «Операция остановлена» UserInfo = {NSLocalizedFailureReason = Это содержимое больше не доступно., NSLocalizedDescription = Операция остановлена}

Мой поток был:

Все это работало и выполнялось так же, как в примере кода HLSCatalog от Apple .Но загрузка все равно выдала бы мне вышеупомянутую ошибку, даже если подключить тот же список воспроизведения и ключевые URL-адреса к примеру кода, это бы хорошо загрузилось.

Я наконец понял, что AVAssetDownloadTask будет загружать только AVURLAsset экземпляр , который уже был передан в потоковом режиме и получил ключи дешифрования (через AVAssetResourceLoaderDelegate) и который не связан с игроком.Я не могу просто создать новый AVURLAsset, используя тот же URL-адрес, который уже воспроизводится, и загрузить его.Похоже, что для загрузки произвольного контента FairPlay мне необходимо:

  • Сделать AVURLAsset
  • Сделать AVPlayer и установить его громкость на 0
  • Дайте ему актив и воспроизведите его
  • Подождите, пока он не запросит свои ключи у загрузчика ресурсов и не начнет играть
  • Дайте ему задачу загрузки и отмените связь с игроком

Но это кажется ужасным.Это не может быть правдой.

Итак, мой вопрос: Как загрузить AVURLAsset с шифрованием FairPlay, не передавая этот конкретный экземпляр раньше?

1 Ответ

0 голосов
/ 11 мая 2018

Оказывается, вы установили preloadsEligibleContentKeys в значение true в загрузчике ресурса актива.Тогда вы можете скачать:

AVURLAsset *asset = [AVURLAsset assetWithURL:self.currDownload.url];
[asset.resourceLoader setDelegate:self queue:dispatch_get_main_queue()];
asset.resourceLoader.preloadsEligibleContentKeys = YES;
AVAssetDownloadTask *task = [self.downloadSession assetDownloadTaskWithURLAsset:asset assetTitle:self.currDownload.title assetArtworkData:nil options:@{AVAssetDownloadTaskMinimumRequiredMediaBitrateKey: @(265000)}];
task.taskDescription = self.currDownload.title;
[task resume];
...