【发布时间】:2015-07-26 11:05:01
【问题描述】:
所以,我正在尝试使用 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;
}
基于上面的代码,以及从其他对resourceloader的Apple文档的进一步阅读:“在加载过程中,可能会要求资源加载器对象协助加载资源。例如,可能会导致需要解密的资源在资源加载器中被要求提供适当的解密密钥。您可以将委托对象分配给资源加载器对象并使用您的委托来拦截这些请求并提供适当的响应“这基本上就是我正在做的。但是,我无法播放我的视频。我确保我解密的数据是正确的(即,我可以将其写入 tmp 文件并可以播放我的 mov)。
【问题讨论】:
-
您是否在资源加载器方法中设置了断点并逐步查看设置了哪些值,尤其是对于
data? -
是的,通过将其写入临时文件验证它是正确的数据,我可以播放我的文件。
-
您可能想查看示例应用程序AVARLDelegateDemo
-
A-Live,我以前去过这个,我相信操作顺序几乎相同,他们使用的是一堆调度队列,而我不是。跨度>
-
你有没有想过这个问题?
标签: ios objective-c avplayer