Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android視頻處理 --處理視頻第一幀縮略圖

Android視頻處理 --處理視頻第一幀縮略圖

編輯:關於Android編程

從API 8開始,新增了一個類:

android.media.ThumbnailUtils這個類提供了3個靜態方法一個用來獲取視頻第一幀得到的Bitmap,2個對圖片進行縮略處理。

public static Bitmap createVideoThumbnail (String filePath, int kind)

第一個參數是視頻文件的路徑,第二個參數是指定圖片的大小,有兩種選擇Thumbnails.MINI_KIND與Thumbnails.MICRO_KIND。

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

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

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

從API 10開始新增一類MediaMetadataRetriever可以用來獲取媒體文件的信息

復制代碼
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();
復制代碼

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

 

復制代碼
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;  
}
 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved