因此,我尝试使用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)。
答案 0 :(得分:3)
我也被困在这项任务上好几天了。这并不困难,但是没有足够的信息(或明确的信息)来说明如何使用AVAssetResourceLoader
和AVAssetResourceLoaderDelegate
。这是我在完成这项任务时得到的东西:
如果您要加载本地视频文件,则必须为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
resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
时,您必须为contentInformationRequest
提供loadingRequest
。您可以找到视频格式列表AV Foundation Constants Reference。另一件事是contentLength
。必须将其设置为解密文件的大小,而不是用于解密的文件。loadingRequest
可以请求重叠数据或多次请求相同的数据。这样您就可以简单地将数据解码并粘贴到dataRequest
。您将需要另一个缓冲区来解码数据。在resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
中,检查您是否有足够的数据要返回,或者您需要解码更多。解码更多数据时,可以清理以前的缓冲区以保持较低的内存,但请记住复制前一个缓冲区中任何未使用的数据。而且,我建议你先尝试播放一个非加密文件。在跳转到加密文件之前,请确保加载loadingRequest
数据的方法正常工作。最后你会发现做这样的任务非常有趣和有趣。快乐的编码:)
答案 1 :(得分:1)
在
行contentRequest.contentType = @"mov";
你必须设置有效的UTI解密内容,如
contentRequest.contentType = @"public.mpeg-4";