1. 程式人生 > >Android之使用MediaMetadataRetriever類獲取視頻第一幀

Android之使用MediaMetadataRetriever類獲取視頻第一幀

nds lin 要求 模擬 路徑 button 成功 使用 watermark

一.首先,來介紹一下MediaMetadataRetriever類,此類位於android.media包下,這裏,先附上可查看此類的API地址:MediaMetadataRetriever類。大家能夠自行查看。

1.MediaMetadataRetriever類概述:MediaMetadataRetriever class provides a unified interface for retrieving frame and meta data from an input media file.

翻譯過來是Mediametadataretriever類提供了一個統一的接口取回幀和取回從一個輸入媒體文件裏的元數據。

2.MediaMetadataRetriever類提供的常量:MediaMetadataRetriever類提供的常量有非常多。都是int常量,有些用來取得媒體文件的元數據,有些用來對獲得視頻的幀的操作,這裏大家能夠查看API,這裏列舉幾個常量:

技術分享

第一個是獲得我們設置的媒體文件的專輯標題,第二個是獲得我們設置的媒體文件的專輯藝術家,第三個獲得我們設置的媒體文件的藝術家,第四個獲得我們設置的媒體文件的作者。

3.MediaMetadataRetriever類的構造方法:MediaMetadataRetriever() 無參構造方法。

4.MediaMetadataRetriever類的公有方法。例如以下圖所看到的:

技術分享

大家能夠依據解釋來知道這些方法的用處。當中一經常使用的方法為setDataSource方法。用來設置數據源,當中這個數據源能夠從文件的路徑,文件描寫敘述符,uri地址和Uri對象來設置。

另外一經常使用的方法getFrameAtTime方法,用來獲取幀,返回一個Bitmap對象,當中能夠獲取到第一幀和多少時間後的幀。



二.此篇文章主要是介紹怎樣使用MediaMetadataRetriever類獲取視頻第一幀的,在編寫我們的Android項目之前。還是要做下面三個步驟:

1.開啟Android模擬器。

2.打開視圖File Explorer,即展示Android模擬器中文件文件夾和文件,當中,必須註意的是Android模擬器的版本號問題,版本號不同存放在SD卡的位置也不同。Android2.x系統SD卡存放的位置為/mnt/sdcard或者/sdcard,而Android4.x系統SD卡存放的位置為/storage/sdcard/。

3.接著就把我們的視頻文件放入SD卡的位置上。我的模擬器版本號為4.x的,所以就在下圖的位置存放視頻文件:

技術分享

假設你存放的文件文件夾是沒有權限放入文件的。就會在控制臺輸出紅色警告。沒有權限。



三.以下,就能夠編寫我們的Android項目,新建一個項目android_mediaMetadataRetriever:

1.打開我們的布局文件activity_main.xml,代碼例如以下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView 
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/ic_launcher"/>
    
    <Button 
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="獲取視頻縮略圖"/>
    
</LinearLayout>

2.打開我們的MainActivity.java文件。代碼例如以下:

package com.android_mediametadataretriever;

import java.io.File;

import android.app.Activity;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private ImageView imageView;//聲明ImageView對象
	private Button button;//聲明Button對象
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		imageView=(ImageView)findViewById(R.id.imageView);//獲取布局管理器中的ImageView控件
		button=(Button)findViewById(R.id.button);//獲取布局管理器中的Button控件
		//設置按鈕點擊事件監聽器
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				MediaMetadataRetriever mmr=new MediaMetadataRetriever();//實例化MediaMetadataRetriever對象
				File file=new File("/storage/sdcard/Movies/music1.mp4");//實例化File對象,文件路徑為/storage/sdcard/Movies/music1.mp4
				if(file.exists()){
					mmr.setDataSource(file.getAbsolutePath());//設置數據源為該文件對象指定的絕對路徑
					Bitmap bitmap=mmr.getFrameAtTime();//獲得視頻第一幀的Bitmap對象
					if(bitmap!=null){
						imageView.setImageBitmap(bitmap);//設置ImageView顯示的圖片
						Toast.makeText(MainActivity.this, "獲取視頻縮略圖成功", Toast.LENGTH_SHORT).show();//獲取視頻縮略圖成功,彈出消息提示框
					}else{
						Toast.makeText(MainActivity.this, "獲取視頻縮略圖失敗", Toast.LENGTH_SHORT).show();//獲取視頻縮略圖失敗,彈出消息提示框
					}
				}else{
					Toast.makeText(MainActivity.this, "文件不存在", Toast.LENGTH_SHORT).show();//文件不存在時。彈出消息提示框
				}
			}
		});
	}

}

當中上面代碼中的File對象指定的路徑為Android 4.x系統的SD卡路徑下的文件夾,假設是較低版本號。還是要看下File Explorer視圖的SD卡路徑是哪個。當中/mnt/sdcard文件夾和/sdcard文件夾都屬於/storage/sdcard文件夾的連接文件。所以真實存放路徑為/storage/sdcard。

3.最後。千萬記得一點,要在AndroidManifest.xml聲明文件加入我們的許可。即權限。在此文件加上一行讀取SD卡文件的權限代碼就可以,代碼例如以下:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

註:當中必須註意的是使用MediaMetadataRetriever類要求android的minSdkVersion最小為14,所以假設你的AndroidManifest.xml文件裏的android:minSDKVersion="8"即最小的sdk版本號小於14的話,將會報錯,解決的方法能夠在AndroidManifest.xml文件裏改最小sdk版本號,也能夠在MainActivity類中加上以下的代碼:

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)

使得我們使用這個MediaMetadataRetriever類不會報錯。


四.部署此項目到Android模擬器,執行效果例如以下:

技術分享

點擊獲取視頻縮略圖button,例如以下圖所看到的:

技術分享



五.以上內容僅供大家學習參考,寫得不好。請見諒,如有錯誤,請指出。謝謝!





 

Android之使用MediaMetadataRetriever類獲取視頻第一幀