MediaMetadataRetriever 사용하기
출처: http://kanirody.blogspot.kr/2015/07/sd-card-video-file-bitmap.html
SD card에 있는 video file 을 Bitmap 으로 추출하기(MediaMetadataRetriever사용하기)
프로젝트 진행 도중에 sdcard에 저장되어있는 mp4 file 을 불러와서
Bitmap으로 추출해야하는 작업이 필요했다.
소스를 분석하기에 앞서
MediaMetadataRetriever에 대해서 알 필요가 있다고 생각하여 간단히 설명하려한다.
말그대로 media의 metadata를 가져올수 있는 class이다.
google 공식 api에서는
말그대로 media의 metadata를 가져올수 있는 class이다.
google 공식 api에서는
MediaMetadataRetriever
extends Objectjava.lang.Object | |
↳ | android.media.MediaMetadataRetriever |
Class Overview
MediaMetadataRetriever class provides a unified interface for retrieving frame and meta data from an input media file.
MediaMetadataRetriever 클래스는 입력 된 미디어 파일로부터 프레임 메타 데이터를 검색하기위한 통일 된 인터페이스를 제공한다.
라고 설명하고 있다. 이제소스를 보자
import android.app.Activity;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
public class MainActivity extends Activity {
private File videoFile;
private Uri videoFileUri;
private MediaMetadataRetriever retriever;
private ArrayList<Bitmap> bitmapArrayList;
private MediaPlayer mediaPlayer;
private Bitmap bitmap;
private Thread thread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// test.mp4 동영상파일을 불러온다.
videoFile = new File(Environment.getExternalStorageDirectory()+"/49.mp4");
videoFileUri = Uri.parse(videoFile.toString());
// instance 생성
retriever = new MediaMetadataRetriever();
// 추출할 bitmap 을 담을 array 생성
bitmapArrayList = new ArrayList<Bitmap>();
// 사용할 data source의 경로를 설정해준다.
retriever.setDataSource(videoFile.toString());
// video file의 총 재생시간을 얻어오기위함
mediaPlayer = MediaPlayer.create(getBaseContext(), videoFileUri);
// 나는 3초 짜리 동영상을 사용했다. millisecond = 3000
int millisecond = mediaPlayer.getDuration();
// 1000씩 증가를 시킨 이유는 총 3초짜리 동영상 을 1초마다 bitmap을 얻고싶어서.
for(int i = 0; i < millisecond; i+=1000){
// getFrameAtTime 함수는 i 라는 타임에 bitmap을 얻어와준다.(
// getFrameAtTime의 첫번째 인자의 unit 은 microsecond이다.
// 그래서 1000을 곱해주었다.
bitmap = retriever.getFrameAtTime(i*1000,MediaMetadataRetriever.OPTION_CLOSEST);
bitmapArrayList.add(bitmap);
}
// retreiver를 다 사용했다면 release를 해주어야한다.
retriever.release();
// Thread start
thread = new Thread(new Runnable(){
@Override
public void run() {
try {
saveFrames(bitmapArrayList);
} catch (IOException e) {
e.printStackTrace();
}
}
});
thread.start();
}
public void saveFrames(ArrayList<Bitmap> saveBitmap) throws IOException{
String folder = Environment.getExternalStorageDirectory().toString();
File saveFolder = new File(folder + "/");
if(!saveFolder.exists()){
saveFolder.mkdirs();
}
int i = 1;
for (Bitmap b : saveBitmap){
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.JPEG, 40, bytes);
File f = new File(saveFolder,("filename"+i+".jpg"));
f.createNewFile();
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
fo.flush();
fo.close();
i++;
}
thread.interrupt();
}
}
댓글
댓글 쓰기