3

我目前正在尝试实施一项服务,以在 tvOS 应用程序上使用 FairPlay 流处理 DRM。这是我的工作流程:

  1. 我将应用程序证书作为数据

  2. 从这个证书我得到 SPC 数据,使用:

    resourceLoadingRequest.streamingContentKeyRequestData(forApp: applicationCertificate, contentIdentifier: assetIDData, options: resourceLoadingRequestOptions)
    
  3. 从编码为 base64Data 的 SPC 数据,我在我们的服务器上请求 POST(在有效负载中带有 SPC)以获得许可证,该许可证为我提供了 CKD 数据

  4. 然后当我得到 CKC 数据时,我使用它们如下:

     guard let dataRequest = resourceLoadingRequest.dataRequest else {
        print("no data is being requested in loadingRequest")
        let error = NSError(domain: AssetLoaderDelegate.errorDomain, code: -6, userInfo: nil)
        resourceLoadingRequest.finishLoading(with: error)
        return
     }
     dataRequest.respond(with: datas)
     resourceLoadingRequest.finishLoading() 
    

但在这些步骤之后,我得到了错误:

Error Domain=AVFoundationErrorDomain Code=-11835 "Cannot Open" UserInfo={NSUnderlyingError=0x170440de0 {Error Domain=NSOSStatusErrorDomain Code=-42681 "(null)"}, NSLocalizedFailureReason=此内容未经授权。, NSLocalizedDescription=Cannot Open}

有没有人有想法或提示?

附加信息:

  • 播放过程适用于不受保护的内容。

  • playerItem.errorLog() 返回零。

  • playerItem.status == .failed 返回真。

  • 所有服务器端进程似乎都可以,因为它已经用于网站和智能电视。

4

1 回答 1

2

I recently ran into this exact same problem. The problem is the CKC response data returned from streamingContentKeyRequestData(forApp... is not just data, it is base 64 encoded string data. All you need to do is decode it before you respond to the data request:

 dataRequest.respond(with: Data(base64Encoded: datas)!)

For production code you'll want to handle the optionality properly. Hope this helps!

于 2019-02-06T01:50:51.937 回答