1. 程式人生 > >Android視訊處理 --處理視訊第一幀縮圖

Android視訊處理 --處理視訊第一幀縮圖

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

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

?

1

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,這個才是縮圖。

?

1

2

extractThumbnail(Bitmap source, int width, int height, int options)

extractThumbnail(Bitmap source, int width, int height)

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

?

1

2

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

bitmap = ThumbnailUtils.extractThumbnail(bitmap, 210, 210);

從API 10開始新增一類MediaMetadataRetriever可以用來獲取媒體檔案的資訊

複製程式碼

?

1

2

3

4

5

6

7

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可以獲取視訊任何一幀的縮圖。

 

複製程式碼

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

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

}

轉自:https://www.2cto.com/kf/201501/370235.html