从服务器获取CKC后,iOS FairPlay视频无法播放

时间:2018-06-03 12:42:27

标签: ios avplayer azure-media-services fairplay

我正在尝试在我的应用程序中实现FairPlay。

我可以使用Apple提供的SDK播放加密视频,但问题是SDK在Swift中,但我的项目是在Objective C中。

所以我在我的项目中重写了代码,但我无法播放视频。

enter image description here

以下是我使用的链接:

  1. 播放列表:https://willzhanmswest.streaming.mediaservices.windows.net/92fc0471-0878-4eeb-80a3-e5b6fc497806/NoAudio.ism/manifest(format=m3u8-aapl)

  2. 证书:https://openidconnectweb.azurewebsites.net/Content/FPSAC.cer

  3. 以下是我遵循的步骤:

    1. 在AVURLAsset中添加了一个委托来调用此函数shouldWaitForLoadingOfRequestedResource。
    2. 在此功能中,我首先获取NSData中的证书内容
    3. 然后,我获取资产字符串并将其转换为NSData。
    4. 然后,我调用此函数来创建SPC值。
    5. NSData *spc = [loadingRequest streamingContentKeyRequestDataForApp:certificate contentIdentifier:assetId options:nil error:nil];
      1. 收到SPC,然后使用application / x-www-form-urlencoded内容类型将资产ID传递给Azure服务器。
      2. 然后修剪收到的CKC以删除并标记,然后将其转换为Base64String然后调用这些函数
      3. [dataRequest respondWithData:base64CkcData];
        [loadingRequest finishLoading];

        有谁能帮我找到我在这里做错了什么?

        感谢。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的麻烦。我假设您从https://gist.github.com/fousa/5709fb7c84e5b53dbdae508c9cb4fadc的obj-c版本开始,是吗?该代码部分似乎对我有用,我只是想知道这是否是您已经拥有的。

// licenseRequestURL is https://keydeliveryURL.azure.net/FairPlay/?kid=whatever-your-key-id-is
// contentId is keydeliveryURL.azure.net

// Create HTTP request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:licenseRequestURL];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"Bearer %@",authenticationToken] forHTTPHeaderField:@"Authorization"];

// Create Request HTTP body:
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
NSString *spcString = [spcData base64EncodedStringWithOptions:0];
NSString *httpBodyString = [NSString stringWithFormat:@"spc=%@&assetId=%@",
                            [spcString stringByAddingPercentEncodingWithAllowedCharacters:
                             [[NSCharacterSet characterSetWithCharactersInString:@"="] invertedSet]], contentId];
[request setHTTPBody:[httpBodyString dataUsingEncoding:NSUTF8StringEncoding]];

// Create session to run request asynchronously
NSURLSession *session = [NSURLSession sessionWithConfiguration:NSURLSessionConfiguration.defaultSessionConfiguration
                                                      delegate:self
                                                 delegateQueue:nil];
NSURLSessionTask *task = [session dataTaskWithRequest:request
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;

    NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSString *stringStrippedOfCkcTags = [[dataString stringByReplacingOccurrencesOfString:@"<ckc>"
                                                                               withString:@""]
                                stringByReplacingOccurrencesOfString:@"</ckc>"
                                                          withString:@""];
    NSData *base64CkcData = [[NSData alloc] initWithBase64EncodedString:stringStrippedOfCkcTags
                                                                options:0];

    [dataRequest respondWithData:base64CkcData];
    [loadingRequest finishLoading];
}];
[task resume];

如果这是您所拥有的,那么可能是视频问题。