Android如何獲取視訊預覽圖(或首幀)和獲取視訊時長
阿新 • • 發佈:2018-12-15
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)。