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에서는

MediaMetadataRetriever

extends Object
java.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();
    }

}

댓글

이 블로그의 인기 게시물

안드로이드 UI/CORE Library 파헤치기!!

안드로이드 책없이 배울수 있는 사이트 소개