天天看點

iOS 播放視訊進行滑動擷取每一幀圖檔并且通過UIImageView展示出來

先在這扯些題外話,最近在公司裡面人心惶惶,因為制度的改變,員工抵制情緒很大,是以離職的人也比較多,是以為了讓自己更值錢,才自發的去學習點東西,知道自己水準很菜,但是還是得提升啊。下面嚴歸正傳,開始上幹貨,我也是在網上搜尋,在檢視官方API,看了某些大神的源碼,自己總結的東西,希望對一些人有用。

//取消快速滑動時 尚未提供的圖像 如果不添加此方法 在快速滑動時 會一貞一貞的解析出預覽圖 增加記憶體消耗 太過耗時
[self.imageGenerator cancelAllCGImageGeneration];
//設定縮略圖的方向       self.imageGenerator.appliesPreferredTrackTransform = YES;
//設定縮略圖的最大寬高
self.imageGenerator.maximumSize = self.imageView.frame.size;
//異步擷取縮略圖
//有三種結果
// AVAssetImageGeneratorSucceeded, 成功
// AVAssetImageGeneratorFailed, 失敗
// AVAssetImageGeneratorCancelled, 取消
AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
//當結果為不成功時,可以設定預覽圖
if (result != AVAssetImageGeneratorSucceeded) {
dispatch_async(dispatch_get_main_queue(), ^{

                    });
                } else {
//結果成功時,擷取到縮略圖,轉換成UIImage 對象
UIImage *thumbImg = [UIImage imageWithCGImage:im];
//該方法主要用主線程來修改頁面UI的狀态。   把不斷擷取到的UIImage 對象 通過此方法傳遞出去 在主線程中顯示出不斷擷取到的縮略圖
[self performSelectorOnMainThread:@selector(movieImage:) withObject:thumbImg waitUntilDone:YES];
                }
            };
            //因為滑動的時候不止一個時間,是有很多個時間 是以滑動時間就有一個數組, 滑動到哪一個時間 就有一個CMTime 上面的block塊 就是當圖像請求完成時調用, 也就是說 滑動到哪個時間 就會有個圖像  通過上面的block 來請求解析 縮略圖
            [self.imageGenerator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:dragedCTime]] completionHandler:handler];
        }

- (void)movieImage:(UIImage *)image
{
    self.imageView.image = image;
}
           

這裡主要提幾點。

1.

取消快速滑動時 尚未提供的圖像 不進行顯示 如果不添加此方法 在快速滑動時 直接執行下面的方法會一幀一幀的解析出預覽圖,如果快速滑動,會全部解析出來,記憶體會暴漲,是以必須執行此方法,降低記憶體消耗。

2.

//結果成功時,擷取到縮略圖,轉換成UIImage 對象
UIImage *thumbImg = [UIImage imageWithCGImage:im];
//該方法主要用主線程來修改頁面UI的狀态。   把不斷擷取到的UIImage 對象 通過此方法傳遞出去 在主線程中顯示出不斷擷取到的縮略圖
[self performSelectorOnMainThread:@selector(movieImage:) withObject:thumbImg waitUntilDone:YES];
           

當通過異步方法不斷的擷取到 CGImageRef 時,就需要通過上面的UIImage 方法轉換成 UIImage 對象 然後進行展示,因為是異步擷取的,是以擷取要把不斷擷取到的UIImage 對象 通過上述的方法 在主線程中進行展示,當時參考看了ZF大神的源碼,就卡在進行展示的這一步,怪自己學藝不精,沒有看懂大神的思路,就自己在網上百度,通過上面方法解決展示的問題。

ZF大神 Git 傳送門 ZFPlayer 源碼

所要寫的就那麼多,不懂的在聯系我QQ 382010738 一起進步。