我正在尝试使用AVPlayer播放加密视频,但是在播放器中没有显示任何内容。
目前,我的进展如下:
1.实现了一个AVPlayer,其中包含一个UIView,用于播放AV内容(播放非加密文件时工作正常)。
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:fileURL options:nil]; //local file url with custom scheme
AVAssetResourceLoader *loader = [asset resourceLoader];
[loader setDelegate:self queue:dispatch_get_main_queue()];
self.playerItem = [AVPlayerItem playerItemWithAsset:asset];
self.player = [AVPlayer playerWithPlayerItem:self.playerItem];
[self.playerView setPlayer:self.player];
从上面的代码中,我知道我的资源加载器方法正在被调用:
2.实现了AVAssetResourceLoaderDelegate
协议,并将资源加载器方法实现如下。
- (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;
}
基于上述代码以及苹果文档中对资源加载器的进一步阅读:
在加载过程中,资源加载器对象可能被要求协助加载资源。例如,需要解密的资源可能导致资源加载器被要求提供适当的解密密钥。您可以将委托对象分配给资源加载器对象,并使用您的委托拦截这些请求并提供适当的响应。
这基本上就是我正在做的事情。但是,我无法播放我的视频。我确保我解密的数据是正确的(即,我可以将它写入临时文件并播放我的mov)。
data
的值? - Phillip Mills