簡體   English   中英

在iOS中使用AVPlayer播放加密視頻

[英]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)。

我也堅持了幾天這個任務。 這並不困難,但是沒有足夠的信息(或清楚信息)如何使用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基礎常量參考列表。 另一件事是contentLength 必須將其設置為解密文件的大小,而不是您用於解密的文件。
  3. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM