1. 程式人生 > >Android如何獲取視訊預覽圖(或首幀)和獲取視訊時長

Android如何獲取視訊預覽圖(或首幀)和獲取視訊時長

Android獲取視訊預覽圖(或首幀)和獲取時長需要用到MediaMetadataRetriever類,獲取預覽圖使用getFrameAtTime()方法,獲取時長使用extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)方法,示例程式碼如下:

        ImageView iv = findViewById(R.id.imageView);
        TextView tv = findViewById(R.id.textView);
        String fileName = "a.mp4";

        try {
            // 獲取預覽圖
            MediaMetadataRetriever mmr = new MediaMetadataRetriever();
            AssetFileDescriptor afd = getAssets().openFd(fileName);
//            mmr.setDataSource(afd.getFileDescriptor()); // failed
            mmr.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            Bitmap previewBitmap = mmr.getFrameAtTime();

            // 縮放
            int PREVIEW_VIDEO_IMAGE_HEIGHT = 300; // Pixels
            int videoWidth = Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
            int videoHeight = Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
            int videoViewWidth = PREVIEW_VIDEO_IMAGE_HEIGHT * videoWidth / videoHeight;
            int videoViewHeight = PREVIEW_VIDEO_IMAGE_HEIGHT;
            Bitmap scaledBitmap = Bitmap.createScaledBitmap(previewBitmap, videoViewWidth, videoViewHeight, true);
            iv.setImageBitmap(scaledBitmap);

            // 獲取時長
            String strDuration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
            int duration = Integer.parseInt(strDuration) / 1000;
            tv.setText(String.format("%d:%02d", duration / 60, duration % 60));

            mmr.release();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

注意

1. getFrameAtTime方法獲取的是視訊中具有代表性的一幀,並不是首幀,原註釋是“This method finds a representative frame at any time position if possible, and returns it as a bitmap.”,獲取首幀需要使用getFrameAtTime(0)

2. 使用setDataSource方法時,如果只傳遞FileDescriptor一個引數執行時會報錯,必須傳遞三個引數。

3. 程式碼中的a.mp4檔案在assets目錄中(Android Studio新增assets目錄方法:在模組名字上右鍵 | New | Folder | Assets Folder)。