[英]Playing AES encrypted hls stream using avplayer - ios swift
[英]Playing Encrypted Videos using AVPlayer in iOS
所以,我正在嘗試使用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;
}
基於上面的代碼,以及從資源加載器的蘋果文檔中的其他進一步閱讀:“在加載期間,可能會要求資源加載器對象協助加載資源。例如,需要解密的資源可能導致資源要求加載程序提供適當的解密密鑰。您可以將委托對象分配給資源加載器對象,並使用您的委托攔截這些請求並提供適當的響應“這基本上就是我正在做的事情。 但是,我無法播放我的視頻。 我確保我解密的數據是正確的(即,我可以將它寫入tmp文件並可以播放我的mov)。
我也堅持了幾天這個任務。 這並不困難,但是沒有足夠的信息(或清楚信息)如何使用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基礎常量參考列表。 另一件事是contentLength
。 必須將其設置為解密文件的大小,而不是您用於解密的文件。 loadingRequest
可以請求重疊數據或多次請求相同的數據。 這樣您就無法簡單地將數據解碼並粘貼到dataRequest
。 您將需要另一個緩沖區來解碼數據。 在resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
,檢查是否有足夠的數據要返回,或者您需要解碼更多。 解碼更多數據時,可以清理以前的緩沖區以保持較低的內存,但請記住復制前一個緩沖區中的任何未使用的數據。 並且,我建議您先嘗試播放未加密的文件。 確保加載loadingRequest
數據的方法在跳轉到加密文件之前正常工作。 最后你會發現做這樣的任務非常有趣和有趣。 快樂編碼:)
在線
contentRequest.contentType = @"mov";
你必須設置有效的解密內容UTI
contentRequest.contentType = @"public.mpeg-4";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.