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

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

一.首先,來介紹一下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模擬器,執行效果如下:

點選獲取視訊縮圖按鈕,如下圖所示:

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

 

相關推薦

Android使用MediaMetadataRetriever獲取視訊第一

一.首先,來介紹一下MediaMetadataRetriever類,此類位於android.media包下,這裡,先附上可檢視此類的API地址:MediaMetadataRetriever類,大家可以自行檢視。 1.MediaMetadataRetriever類概述:Med

android獲取圖片原始長寬,獲取視訊第一的縮圖

public static Bitmap getVideoThumbnail(String videoPath) { MediaMetadataRetriever media =new MediaMetadataRetriever(); media.setDataSource(videoPat

Android 獲取視訊第一縮圖

乾貨 從API 8開始,新增了一個類: android.media.ThumbnailUtils這個類提供了3個靜態方法一個用來獲取視訊第一幀得到的Bitmap,2個對圖片進行縮略處理。 public static Bitmap createVideoThumbna

Android -- 獲取視訊第一縮圖

從API 8開始,新增了一個類: android.media.ThumbnailUtils這個類提供了3個靜態方法一個用來獲取視訊第一幀得到的Bitmap,2個對圖片進行縮略處理。 public static Bitmap createVideoThumbnail (

windows下PHP獲取視訊第一圖片作為背景圖

我在網上找了很多這方面的資料,總結如下:一般用ffmpeg獲取視訊第一幀圖片作為背景圖; ffmpeg的下載連結  http://ffmpeg.org/download.html ; 下載好包,包裡面在

Java獲取視訊第一做縮圖

Java使用FFmpeg獲取視訊的縮圖 ffmpegPath為FFmpeg.exe所在路徑 upFilePath為視訊的所在路徑(本地路徑) mediaPicPath為縮圖的儲存路徑(D:/test.jpg) private void handler(String ffm

Android使用MediaMetadataRetriever獲取視頻第一

nds lin 要求 模擬 路徑 button 成功 使用 watermark 一.首先,來介紹一下MediaMetadataRetriever類,此類位於android.media包下,這裏,先附上可查看此類的API地址:MediaMetadataRetrieve

Android使用MediaMetadataRetriever獲取媒體信息

ren sym wid cte pad () 許可 card med 一.昨天。介紹了使用MediaMetadataRetriever類來獲取視頻第一幀:http://blog.csdn.net/u012561176/article/details/47858099,今

Android在Adapter中獲取網路視訊第一(優化)

 獲取成功以後使用的是map儲存,key為adapter的position 避免銷燬再次載入 @SuppressLint("UseSparseArrays") private Map<Integer, Bitmap> bitmapMap = new Hash

Android通過ContentResolver獲取手機圖片和視訊的路徑和生成縮圖和縮圖路徑

1 問題 獲取手機所有圖片和視訊的路徑和生成圖片和視訊的縮圖和縮圖路徑 生成縮圖我們用的系統函式 public static Bitmap getThumbnail(ContentResolver cr, long origId, int kind, Opti

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

從API 8開始,新增了一個類: android.media.ThumbnailUtils這個類提供了3個靜態方法一個用來獲取視訊第一幀得到的Bitmap,2個對圖片進行縮略處理。 ? 1 public static Bitmap createVi

Android-VideoView視訊播放(視訊第一,迴圈播放,隱藏播放條、橫屏生命週期、快取問題)

大綱 * VideoView播放網路視訊、播放本地視訊 * 實現邊播邊快取 * 獲取視訊的第一幀圖片作為封面 * 實現類似朋友圈小視訊迴圈播放 * 隱藏播放條 * 互動,點選螢幕退出播放 * 解決橫屏生命週期重新載入的問題 * 載入時進度條的顯示與消失監聽 p

AndroidMainActivity

點擊事件 oncreate setting 調用 source gen 同一時間 我們 android Android之MainActivity類 一、MainActivity: 1、每個種語言都有一個程序入庫(如:C#main函數),而Android

linux系統,CentOS7.2安裝ffmpeg擴充套件,PHP用FFmpeg擷取視訊第一作為視訊封面,並給圖片新增播放視訊按鈕

最近做公司的專案中,有使用者上傳視訊,後臺這邊接收視訊並上傳,獲取視訊第一幀作為視訊封面的功能,在網上查找了好多資料,並且安裝 了ffmpeg-php的PHP擴充套件,由於版本問題,安裝好幾個版本都不成功,最後放棄安裝擴充套件,後來執行程式碼發現不用安裝那個擴充套件也能實現截圖並上傳的功能,所以要擷

php用ffmpeg擴充套件擷取視訊第一的方法

windows 或linux上要安裝ffmpeg擴充套件,安裝方法可以自行百度 通過執行外部命令的方式exec()實現,如果是本地視訊很方便,$tempfiles就是完整的視訊路徑;如果是post過來的視訊(僅限.mp4格式),無法用臨時檔案(.tmp)進行擷取,本人的用了個笨方法,

AndroidRetrofit網路獲取框架

Retrofit網路獲取能優點很多,最實用的就是不用進行麻煩的Json具體解析,簡單,優化,高效率 一、建立介面: public interface MenuService { //http://www.qubaobei.com/ios/cf/dish_list.php?stage_

檔案上傳至oss後,獲取圖片縮率圖、獲取視訊等後續操作

上一篇文章說了一下檔案上傳至oss:https://blog.csdn.net/new_programmer_h/article/details/84307005 這裡說一下上傳後的一些後續操作:常用的獲取圖片縮率圖、獲取視訊截幀生成封面圖。自我感覺阿里oss對於這些處理封裝的很好,只要根據:"%s|sys

Android座標系以及獲取座標系的方法

概括:Android中有兩種座標系(Android座標系和檢視座標系)。下面將介紹這兩種座標系以及在座標系中獲取對應的座標值的一些方法。 Android座標系和檢視座標系 1)Android座標系 所謂的Android座標系就是以手機螢幕左上角為原點,從該點水平向右為X軸,從該點水平向下

vue 擷取視訊第一

最近自己寫專案,在專案中涉及功能點又擷取視訊幀的點;需求澄清:移動端封面展示,平臺上傳圖片(多張上傳)取第一張上傳圖片為封面圖;如上傳視訊則擷取視訊第一幀作為封面圖; 實現思路;h5  video標籤,canvas;上傳視訊成功之後把返回視訊地址放到video標籤內,通過canvas畫布擷取視訊第一幀; 元

[OpenCV] 基於聚視訊關鍵提取

參考論文: 1.《用非監督式聚類進行視訊鏡頭分割》 2.《一種基於視訊聚類的關鍵幀提取方法》                            右邊為提取出來的關鍵幀          聚類的基本思想是,先把視訊聚成n個類,這n個類內的視訊幀是相似的,而類與類之間的