マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

動画を撮ってみる

http://developer.android.com/reference/android/media/MediaRecorder.htmlを参考に動画を撮るプログラムを作成してみた。なんとなくカメラを使う感覚でSurfaceViewやSurfaceHolder.Callbackを使ってみたが、これでいいのだろうか?とりあえず動画を撮ることができる。MediaRecorderのstartを呼び出してからstopが呼び出されるまでの間がsetOutputFileで指定したファイルに保存されるらしい。

実行するために以下のパーミッションが必要。カメラ用と録音用とファイル保存のため

android.permission.CAMERA
android.permission.RECORD_AUDIO
android.permission.WRITE_EXTERNAL_STORAGE
package test.video;

import java.io.File;

import android.os.Environment;
import android.content.Context;
import android.media.MediaRecorder;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class RecordView extends SurfaceView implements SurfaceHolder.Callback{
    private MediaRecorder recorder;
    private boolean isRecord;
    
    public RecordView(Context context){
        super(context);
        isRecord = false;
        
        SurfaceHolder holder = getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
    
    public void surfaceCreated(SurfaceHolder holder) {        
        recorder = new MediaRecorder();
        recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
        recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    }
    
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        recorder.setOutputFile(createPath());
        recorder.setVideoFrameRate(15);
        recorder.setVideoSize(width, height);
        recorder.setPreviewDisplay(holder.getSurface());
        
        try{
            //プレビュー開始
            recorder.prepare();
        }catch(Exception e){
            android.util.Log.e("Error", e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {

    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event){     
        
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            if(!isRecord){
                isRecord = true;
                
                //撮影開始
                recorder.start();
            }else{
                recorder.stop();
                recorder.release();
            }
        }    
        return true;
    }
    
    private String createPath(){
        File dir = Environment.getExternalStorageDirectory();
        File appDir = new File(dir, "VideoTest");
        
        if(!appDir.exists()){
            appDir.mkdir();
        }
        
        String name = System.currentTimeMillis() + ".3gp";
        return new File(appDir, name).getAbsolutePath();
    }
}