小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Android -- 獲取視頻第一幀縮略圖

 WindySky 2016-05-13

 從API 8開(kāi)始,新增了一個(gè)類(lèi):

Android.media.ThumbnailUtils這個(gè)類(lèi)提供了3個(gè)靜態(tài)方法一個(gè)用來(lái)獲取視頻第一幀得到的Bitmap,2個(gè)對(duì)圖片進(jìn)行縮略處理。

public static Bitmap createVideoThumbnail (String filePath, int kind)

第一個(gè)參數(shù)是視頻文件的路徑,第二個(gè)參數(shù)是指定圖片的大小,有兩種選擇Thumbnails.MINI_KINDThumbnails.MICRO_KIND。

  • 第一種文檔上說(shuō)大小是512 x 384 ,我用一個(gè)MP4格式文件測(cè)試得到544 x 960,用一個(gè)wmv格式文件測(cè)試得到160 x 120。明顯不靠譜。
  • 第二種參數(shù)兩種格式文件得到的大小都是 96 x 96,這個(gè)才是縮略圖。
extractThumbnail(Bitmap source, int width, int height, int options)
extractThumbnail(Bitmap source, int width, int height)

這兩種方法都是用來(lái)處理Bitmap的大小的,第一個(gè)參數(shù)是要處理的Bitmap,第二個(gè)參數(shù)是處理后寬度,第三個(gè)是高度,第四個(gè)參數(shù)options,如果options定義為OPTIONS_RECYCLE_INPUT,則回收資源。也就是說(shuō)可以用第三種方法把截取到的視頻第一幀的Bitmap轉(zhuǎn)成任意想要的大小,第三個(gè)方法還可以獲取內(nèi)存卡內(nèi)圖片的縮略圖。

Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path1, Thumbnails.MINI_KIND);  
bitmap = ThumbnailUtils.extractThumbnail(bitmap, 210, 210);

API 10開(kāi)始新增一類(lèi)MediaMetadataRetriever可以用來(lái)獲取媒體文件的信息

復(fù)制代碼
MediaMetadataRetriever mmr = new MediaMetadataRetriever();  
mmr.setDataSource("/sdcard/33.mp4");  
Bitmap bitmap = mmr.getFrameAtTime();  
image.setImageBitmap(bitmap);  
System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE)+"");  
System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)+"");  
mmr.release();
復(fù)制代碼

MediaMetadataRetriever可以獲取視頻任何一幀的縮略圖。

 

復(fù)制代碼
public static Bitmap createVideoThumbnail(String filePath) {  
    // MediaMetadataRetriever is available on API Level 8  
    // but is hidden until API Level 10  
    Class<?> clazz = null;  
    Object instance = null;  
    try {  
        clazz = Class.forName("android.media.MediaMetadataRetriever");  
        instance = clazz.newInstance();  
  
        Method method = clazz.getMethod("setDataSource", String.class);  
        method.invoke(instance, filePath);  
  
        // The method name changes between API Level 9 and 10.  
        if (Build.VERSION.SDK_INT <= 9) {  
            return (Bitmap) clazz.getMethod("captureFrame").invoke(instance);  
        } else {  
            byte[] data = (byte[]) clazz.getMethod("getEmbeddedPicture").invoke(instance);  
            if (data != null) {  
                Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);  
                if (bitmap != null) return bitmap;  
            }  
            return (Bitmap) clazz.getMethod("getFrameAtTime").invoke(instance);  
        }  
    } catch (IllegalArgumentException ex) {  
        // Assume this is a corrupt video file  
    } catch (RuntimeException ex) {  
        // Assume this is a corrupt video file.  
    } catch (InstantiationException e) {  
        Log.e(TAG, "createVideoThumbnail", e);  
    } catch (InvocationTargetException e) {  
        Log.e(TAG, "createVideoThumbnail", e);  
    } catch (ClassNotFoundException e) {  
        Log.e(TAG, "createVideoThumbnail", e);  
    } catch (NoSuchMethodException e) {  
        Log.e(TAG, "createVideoThumbnail", e);  
    } catch (IllegalAccessException e) {  
        Log.e(TAG, "createVideoThumbnail", e);  
    } finally {  
        try {  
            if (instance != null) {  
                clazz.getMethod("release").invoke(instance);  
            }  
        } catch (Exception ignored) {  
        }  
    }  
    return null;  
}
復(fù)制代碼

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多