应用关闭时离线HLS Fairplay播放错误,代码16227

时间:2017-11-30 18:04:26

标签: ios11 offline hls avurlasset fairplay

我正在使用带有AVContentSessionKey的FairPlay Streaming Server SDK v4.0.1中的演示实现与HLS Fairplay的离线播放。 我下载了三个内容,每个内容都下载并正确保存,文件目录中的.movpkg及其内容键,当我关闭WIFI时,下载的这三个内容没有任何问题正常播放,然后使用此代码播放Im: / p>

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并加载密钥并将其正确传递给请求。

如果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关联,我不知道如何。

如果有人遇到类似的问题,我们将不胜感激。

提前致谢

4 个答案:

答案 0 :(得分:1)

您在服务器端使用哪个TLLV来指定下载内容的租用期限?您是否使用内容密钥持续时间TLLV或脱机密钥TLLV?如果您使用了脱机密钥TLLV,则需要仔细检查每个下载的电影的“内容ID”字段是否不同。

答案 1 :(得分:0)

我遇到了类似的问题。

但是,由于我需要支持iOS 10,所以我没有使用新的AVContentKeyResponse类。相反,我自己加载持久性内容密钥,并将其传递给加载请求。

无论如何,我得到与你相同的错误和相同的行为。需要注意的一点是,如果我删除从磁盘加载持久内容密钥的代码,并始终从服务器获取密钥,那么一切正常。但这违背了“离线”播放的目的......

因此系统认为持久性内容密钥无效......

答案 2 :(得分:0)

我们也遇到了此错误消息。 当内容超过服务器端设置的过期日期时,就会发生这种情况。

例如:

  1. 我们给出视频A的有效期为10分钟

  2. 下载此视频A,并确认CKC正确交付(打印日志)

  3. 在没有连接的情况下播放视频A

  4. 休息片刻(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)"}}

您可以通过

再次刷新加密的数据
  1. AVAssetResourceLoaderDelegate
  2. 或使用AVContentSessionKey

参考:https://developer.apple.com/videos/play/wwdc2018/507/

答案 3 :(得分:0)

确保在服务器端设置正确的脱机内容标识符。您设置的标识符应与许可证所允许的特定格式/流关联。这对我有帮助。