在iOS中使用AVPlayer播放加密视频

时间:2015-05-14 17:49:04

标签: ios objective-c avplayer

因此,我尝试使用AV播放器播放加密视频,播放器中没有任何内容。

所以我在该项目上取得的进展如下:

1.实现了一个AVPlayer,它将具有播放AV内容的UIView(这对于播放非加密文件非常有用。)

- (BOOL) resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest 
{
    NSURLRequest* request = loadingRequest.request;
    AVAssetResourceLoadingDataRequest* dataRequest = loadingRequest.dataRequest;
    AVAssetResourceLoadingContentInformationRequest* contentRequest = loadingRequest.contentInformationRequest;
    NSMutableData *data;
    //handle content request
    if (contentRequest)
    {
        contentRequest.contentType = @"mov";
        contentRequest.contentLength = movieFileLengthInBytes
        contentRequest.byteRangeAccessSupported = YES;
    }
    if (dataRequest)
    {
        DecryptedStream* readStream = [FS getReadStream:filename error:nil];
        if (readStream)
        {
            while ([readStream hasBytesAvailable])
            {
                NSInteger nRead;
                uint8_t buffer[kBufferReadSize];
                nRead = [readStream read:buffer maxLength:kBufferReadSize];
                NSMutableData *data = [NSMutableData data];
                [data appendBytes:buffer length:nRead];
                [dataRequest respondWithData:data];
            }
        }
        [loadingRequest finishLoading];
    }
    return YES;
}

从上面的代码中,我知道我正在调用以下资源加载器方法:

2.实现了AVAssetResourceLoaderDelegate协议,并且我已经实现了如下资源加载器方法。

pgraf <- function () {

  library(ggplot2)

  dframe <- data.frame( x = c(3,1,5), y= c(2,4,6), label = c("a", "b", "c"))

  p <- ggplot (dframe, aes(x, y, label = label)) + xlab(NULL) + ylab(NULL)
  p <- p + geom_point() + opts(title="geom_point")

  return (pgraf)
}

基于上面的代码,以及从资源加载器的苹果文档中的其他进一步阅读:&#34;在加载期间,可以要求资源加载器对象协助加载资源。例如,需要解密的资源可能导致要求资源加载器提供适当的解密密钥。您可以将委托对象分配给资源加载器对象,并使用您的委托拦截这些请求并提供适当的响应&#34;这基本上就是我正在做的事情。但是,我无法播放视频。我确保我解密的数据是正确的(即,我可以将其写入tmp文件并可以播放我的mov)。

2 个答案:

答案 0 :(得分:3)

我也被困在这项任务上好几天了。这并不困难,但是没有足够的信息(或明确的信息)来说明如何使用AVAssetResourceLoaderAVAssetResourceLoaderDelegate。这是我在完成这项任务时得到的东西:

  1. 如果您要加载本地视频文件,则必须为fileURL提供自定义方案才能使用AVAssetResourceLoaderDelegate

    let urlComponents = NSURLComponents(URL: fileURL, resolvingAgainstBaseURL: false)
    urlComponents?.scheme = "enc"
    let asset = AVURLAsset(URL: urlComponents!.URL!, options: nil)
    

    简单使用let asset = AVURLAsset(URL: fileURL, options: nil)不会触发任何AVAssetResourceLoaderDelegate

  2. 使用resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest时,您必须为contentInformationRequest提供loadingRequest。您可以找到视频格式列表AV Foundation Constants Reference。另一件事是contentLength。必须将其设置为解密文件的大小,而不是用于解密的文件。
  3. loadingRequest可以请求重叠数据或多次请求相同的数据。这样您就可以简单地将数据解码并粘贴到dataRequest。您将需要另一个缓冲区来解码数据。在resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest中,检查您是否有足够的数据要返回,或者您需要解码更多。解码更多数据时,可以清理以前的缓冲区以保持较低的内存,但请记住复制前一个缓冲区中任何未使用的数据。
  4. 而且,我建议你先尝试播放一个非加密文件。在跳转到加密文件之前,请确保加载loadingRequest数据的方法正常工作。最后你会发现做这样的任务非常有趣和有趣。快乐的编码:)

答案 1 :(得分:1)

contentRequest.contentType = @"mov";

你必须设置有效的UTI解密内容,如

contentRequest.contentType = @"public.mpeg-4";