閱讀274 返回首頁    go 阿裏雲 go 技術社區[雲棲]


【短視頻SDK】如何獲取單視頻的縮略圖?

獲取視頻縮略圖iOS和Android分別提供一個方法得到一個視頻的縮略圖,如果需要多張需要開發者自己調用多次即可.

1.Android獲取視頻縮略圖,僅演示單視頻縮略圖獲取方法

核心接口:AliyunIThumbnailFetcher

//1.創建一個AliyunIThumbnailFetcher的實例
AliyunIThumbnailFetcher mThumbnailFetcher = AliyunThumbnailFetcherFactory.createThumbnailFetcher();
//2.添加一個視頻源---path為開發者視頻的本地路徑
mThumbnailFetcher.addVideoSource("path");
//3.設置輸出參數
/*
 * @param width 輸出寬度
 * @param height 輸出高度
 * @param mode 裁剪模式 (目前可以忽略,填任意值,所有的都是從中間裁剪)
 * @param scaleMode 縮放模式 (目前可以忽略,填任意值,隻支持裁剪模式,不支持填充模式)
 * @param cacheSize 緩存大小,即緩存的縮略圖數量,緩存的圖片不需要重新解碼取,以達到減少耗時的目的.
*/
mThumbnailFetcher.setParameters(60,60,AliyunIThumbnailFetcher.CropMode.Mediate,ScaleMode.LB, 30);
//4.獲取某個時間點的縮略圖
mThumbnailFetcher.requestThumbnailImage(times,
new AliyunIThumbnailFetcher.OnThumbnailCompletion() {
public void onThumbnailReady(ShareableBitmap frameBitmap, long time){
    //成功拿到圖片的回調frameBitmap.getData()即可拿到一個bitmap
    //需要拿到多張如何做?就在onThumbnailReady這個回調裏麵再調用一  次requestThumbnailImage傳入不一樣的時間即可.
}
 public void onError(int errorCode) {
    //出錯的回調
}
});
//5.釋放
mThumbnailFetcher.release()

注意:目前僅專業版有該接口.如基礎版或者是標準版有該需求可以通過MediaMetadataRetriever來獲取,單該接口僅能返回關鍵幀的圖片,如果需要獲取N張會有重複圖片的情況.可耐心等待SDK提供獨立的獲取縮略圖的接口.

public Bitmap getVideoThumbnail(String filePath) {  
    Bitmap bitmap = null;  
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();  
    try {  
        retriever.setDataSource(filePath);  
        bitmap = retriever.getFrameAtTime();  
    }   
    catch(IllegalArgumentException e) {  
        e.printStackTrace();  
    }   
    catch (RuntimeException e) {  
        e.printStackTrace();  
    }   
    finally {  
        try {  
            retriever.release();  
        }   
        catch (RuntimeException e) {  
            e.printStackTrace();  
        }  
    }  
    return bitmap;  
}

2.iOS獲取視頻縮略圖,僅演示單視頻縮略圖獲取方法

iOS因為係統函數就可以直接做到獲取非關鍵幀縮略圖,所以我們直接使用AVFoundation獲取即可.需要多張圖片調用多次即可.

/**
 *  獲取視頻的縮略圖方法
 *
 *  @param filePath 視頻的本地路徑
 *
 *  @return 視頻截圖
 */
- (UIImage *)getScreenShotImageFromVideoPath:(NSString *)filePath{
    UIImage *shotImage;
    //視頻路徑URL
    NSURL *fileURL = [NSURL fileURLWithPath:filePath];
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:fileURL options:nil];
    AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    gen.appliesPreferredTrackTransform = YES;
    CMTime time = CMTimeMakeWithSeconds(0.0, 600);
    NSError *error = nil;
    CMTime actualTime;
    CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];
    shotImage = [[UIImage alloc] initWithCGImage:image];
    CGImageRelease(image);
    return shotImage;
}

最後更新:2017-08-29 20:32:18

  上一篇:go  如何應用OSS的內網地址
  下一篇:go  MySQL鎖係列(九)之 long transaction