Ошибка воспроизведения в автономном режиме HLS Fairplay при закрытии приложения, код 16227
Я реализую автономное воспроизведение с HLS Fairplay после демонстрации в FairPlay Streaming Server SDK v4.0.1, которая использует AVContentSessionKey. Я загружаю три контента, каждый контент загружается и сохраняется правильно, как.movpkg, так и его ключ контента в каталоге документов. Когда я выключаю WIFI, эти три скачанных контента воспроизводятся без проблем, перед тем как воспроизвести Im с использованием этого кода:
let urlAsset = element.urlAsset!
ContentKeyManager.shared.contentKeySession.addContentKeyRecipient(urlAsset)
if !urlAsset.resourceLoader.preloadsEligibleContentKeys {
urlAsset.resourceLoader.preloadsEligibleContentKeys = true
}
self.present(playerViewController, animated: true, completion: {
AssetPlaybackManager.sharedManager.setAssetForPlayback(urlAsset)
})
Все идет нормально. Но проблема в том, что когда я закрываю приложение (кнопка "Домой", чтобы закрыть приложения), а затем воспроизводит загруженный контент, правильно воспроизводится только последний загруженный контент, остальные (первый и второй) отправляют эти ошибки на консоль.
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed"
UserInfo={NSUnderlyingError=0x1c065d760 {Error Domain=NSOSStatusErrorDomain Code=-16227 "(null)"},
NSLocalizedFailureReason=An unknown error occurred (-16227),
NSURL=file:///private/var/mobile/Containers/Data/Application/A950D8DB-B711-47E3-AAF5-C95CC9682430/Library/com.apple.UserManagedAssets.kkG8Ih/644986_7798B8476A473F68.movpkg/, NSLocalizedDescription=The operation could not be completed}
Я дважды проверяю.movpkg с ключами в каталоге документов и отображается правильно
/Documents/.keys/one-key
/Documents/.keys/two-key
/Documents/.keys/three-key
Перед возникновением ошибки вызывается ContentKeyDelegate, и ключ загружается и правильно передается в запрос.
if persistableContentKeyExistsOnDisk (withContentKeyIdentifier: assetIDString) {
let urlToPersistableKey = urlForPersistableContentKey(withContentKeyIdentifier: assetIDString)
guard let contentKey = FileManager.default.contents(atPath: urlToPersistableKey.path) else {
/
pendingPersistableContentKeyIdentifiers.remove(assetIDString)
return
}
/
Create an AVContentKeyResponse from the persistent key data to use for requesting a key for
decrypting content.
*/
let keyResponse = AVContentKeyResponse(fairPlayStreamingKeyResponseData: contentKey)
/
keyRequest.processContentKeyResponse(keyResponse)
return
}
Если я печатаю contentKeyRecipients, три содержимого отображаются правильно
- (lldb) po
ContentKeyManager.shared.contentKeySession.contentKeyRecipients ▿ 3
elements
- 0 : AVURLAsset: 0x1c0234d40, URL = file:///private/var/mobile/Containers/Data/Application/E791A4DE-4261-46B7-A84D-D10B27035FAE/Library/com.apple.UserManagedAssets.kkG8Ih/539628_20469336224AA388.movpkg
- 1 : AVURLAsset: 0x1c0234fa0, URL = file:///private/var/mobile/Containers/Data/Application/E791A4DE-4261-46B7-A84D-D10B27035FAE/Library/com.apple.UserManagedAssets.kkG8Ih/644986_7798B8476A473F68.movpkg
- 2 : AVURLAsset: 0x1c42391c0, URL = file:///private/var/mobile/Containers/Data/Application/E791A4DE-4261-46B7-A84D-D10B27035FAE/Library/com.apple.UserManagedAssets.kkG8Ih/573744_62377F9549C45B93.movpkg
Мои тесты в iOS 11.1.2 и iOS 11.2 beta 2
Я не уверен, что происходит, но, похоже, проблема с постоянным ключом, я не знаю, как каждый контент должен быть связан с одной AVContentKeySession одновременно.
Если кто-то сталкивался с подобной проблемой, любая помощь будет оценена.
заранее спасибо
3 ответа
Какой TLLV вы использовали на стороне сервера для указания продолжительности аренды загружаемого контента? Использовали ли вы длительность ключа содержимого TLLV или автономный ключ TLLV? Если вы использовали TLLV в автономном режиме, вам необходимо дважды проверить, что поле "Идентификатор контента" отличается для каждого загруженного фильма.
У меня похожая проблема.
однако, поскольку мне нужно поддерживать iOS 10, я не использую новый класс AVContentKeyResponse. Вместо этого я сам загружаю постоянный ключ контента и передаю его в запрос на загрузку.
В любом случае, я получаю точно такую же ошибку, как и вы, и такое же поведение. Стоит отметить, что если я удаляю код, который загружает ключ постоянного содержимого с диска, и всегда извлекаю ключ с сервера, то все работает. Но это побеждает цель "автономного" воспроизведения...
Похоже, система считает, что постоянный ключ содержимого недействителен...
Убедитесь, что вы установили правильный идентификатор автономного контента на стороне сервера. Установленный вами идентификатор должен быть связан с конкретным воспроизведением / потоком, разрешенным лицензией. Это мне помогло.
Мы также столкнулись с этим сообщением об ошибке. Это произойдет, когда содержимое превысит срок действия, установленный на стороне сервера.
Например:
Мы даем 10 минут срока годности для Видео A
Загрузите это видео A и проверьте правильность доставки CKC (распечатать журнал)
Воспроизвести видео A без подключения
Сделайте перерыв (через 11 минут), закройте приложение и снова запустите приложение, выберите "Видео A для воспроизведения"
Покажите ниже сообщение об ошибке от AVPlayerItem.error.description:
Error Domain=AVFoundationErrorDomain Code=-11800
"The operation could not be completed" UserInfo={NSLocalizedFailureReason=An unknown error occurred (-16227),
NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x1d4257310
{Error Domain=NSOSStatusErrorDomain Code=-16227 "(null)"}}
Вы можете обновить зашифрованные данные снова,
- AVAssetResourceLoaderDelegate
- или используйте AVContentSessionKey
Ссылка: https://developer.apple.com/videos/play/wwdc2018/507/