2012年5月28日 星期一

Android Video Recording


  • Create a layout for video capture
    setContentView(R.layout.video_capture);
  • Create a button for video recording start and stop
    mVideoRecording = (Button)findViewById(R.id.video_recording);
    mVideoRecording.setOnClickListener(
        new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mIsRecordingVideo == false) {
                    mVideoRecording.setText(
                        R.string.video_recording_stop);
                    videoRecordingStart();
                } else {
                    videoRecordingStop();                    
                }
            }
        });

  • Create a preview surface view and surface holder
    mPreview = (SurfaceView) findViewById(
                                 R.id.video_capture_view);
    SurfaceHolder holder = mPreview.getHolder();
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  • Stop video recording on activity pause

    public void onPause() {
                    ...
        if (mIsRecordingVideo == true) {
            videoRecordingStop();
        ...
                    
  • Search for front facing camera and set orientation
    CameraInfo camerainfo = new Camera.CameraInfo();
    for (int index = 0;
         index < Camera.getNumberOfCameras();
         index++) {
        Camera.getCameraInfo(index, camerainfo);
        if (camerainfo.facing ==
            Camera.CameraInfo.CAMERA_FACING_FRONT) {
            try {
                mCamera = Camera.open(index);
                mCameraOrientation =
                    (camerainfo.orientation + 0) % 360;
                mCameraOrientation = (360 - mCameraOrientation);
                mCamera.setDisplayOrientation(
                            mCameraOrientation);
                Camera.Parameters cameraparameters =
                                      mCamera.getParameters();
                cameraparameters.setRotation(
                                     camerainfo.orientation);
                mCamera.setParameters(cameraparameters);
            } catch (RuntimeException e) {
                Log.i(mTAG, e.getMessage(), e);  
            }
        }
    }

  • Search for back facing camera and set orientation
    for (int index = 0;
         index < Camera.getNumberOfCameras();
         index++) {
        Camera.getCameraInfo(index, camerainfo);
        if (camerainfo.facing ==
            Camera.CameraInfo.CAMERA_FACING_BACK) {
            try {
                mCamera = Camera.open(index);
                mCameraOrientation =
                    (camerainfo.orientation + 0) % 360;
                mCamera.setDisplayOrientation(
                            mCameraOrientation);
                Camera.Parameters cameraparameters =
                                      mCamera.getParameters();
                cameraparameters.setRotation(
                                     camerainfo.orientation);
                mCamera.setParameters(cameraparameters);
            } catch (RuntimeException e) {
                Log.i(mTAG, e.getMessage(), e);  
            }
        }
    }
  • Start camera preview and unlock
    mCamera.startPreview();
    mCamera.unlock();
  • Generate mp4 file name for video recording
    String path = null;
    File dir = null;
    String name = null;
    try {
        path = String.format(getExternalFilesDir(null).
                                 getPath().toString());
        dir = new File(path);
        if (!dir.exists())
            dir.mkdirs();
        MP4FileFilter filter = new MP4FileFilter();
        File[] files = dir.listFiles(filter);
        if (files != null) {
            for (File file : files) {
                file.delete();
            }
        }
        name = String.format("/%d.mp4",
                                 System.currentTimeMillis());
    } catch(Exception e) {
        Log.i(mTAG, e.getMessage(), e);  
    }

  • Create media recorder and setting up
    mMediaRecorder = new MediaRecorder();
    mMediaRecorder.setCamera(mCamera);
    mMediaRecorder.setVideoSource(
                       MediaRecorder.VideoSource.CAMERA);
    mMediaRecorder.setAudioSource(
                       MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setOutputFormat(
                       MediaRecorder.OutputFormat.MPEG_4);
    mMediaRecorder.setVideoEncoder(
                       MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setAudioEncoder(
                       MediaRecorder.AudioEncoder.AAC);
    if ((path != null) && (name != null)) {
        mVideoRecordingPath = path + name;
        mMediaRecorder.setOutputFile(new File(path,
                           name).getAbsolutePath());
        mMediaRecorder.setVideoSize(640, 480);
        mMediaRecorder.setVideoFrameRate(15);
    }

  • Stop camera preview and release
    mCamera.stopPreview();
    mCamera.release();

  • Stop media recorder and release
    mMediaRecorder.stop();
    ...
    mMediaRecorder.release();

  • Save video file path and video volume for later use
    SharedPreferences preferences = getApplicationContext().
                          getSharedPreferences("VideoRecording",
                              MODE_PRIVATE);
    Editor editor = preferences.edit();
    editor.putString("video_path", mVideoRecordingPath);
    AudioManager audioManager = (AudioManager)
                     getApplicationContext().
                         getSystemService(Context.AUDIO_SERVICE);
    mVideoVolume = audioManager.getStreamVolume(
                                    AudioManager.STREAM_MUSIC);
    editor.putInt("video_volume", mVideoVolume);
    editor.commit();


  • Remove title bar

    requestWindowFeature(Window.FEATURE_NO_TITLE);

  • Set full screen display and keep screen on          getWindow().addFlags(
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().addFlags(
        WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);




  • Sample code for android video recording:
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.media.AudioManager;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;

public class VideoRecordingActivity extends Activity {
 private final String mTAG = "VideoRecordingActivity";
    private Button mVideoRecording;
    private boolean mIsRecordingVideo = false;
    private SurfaceView mPreview;
    private MediaRecorder mMediaRecorder;
    private Camera mCamera;
    private int mCameraOrientation = 0;
    private String mVideoRecordingPath;
    private int mVideoVolume;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.video_capture);
        getWindow().addFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().addFlags(
            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        mVideoRecording = (Button)findViewById(
                                      R.id.video_recording);
        mVideoRecording.setOnClickListener(new Button.
                            OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mIsRecordingVideo == false) {
                    mVideoRecording.setText(
                        R.string.video_recording_stop);
                    videoRecordingStart();
                } else {
                    videoRecordingStop();                    
                }
            }
        });
        mPreview = (SurfaceView) findViewById(
                                     R.id.video_capture_view);
        SurfaceHolder holder = mPreview.getHolder();
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
   
    @Override
    public void onPause() {
        super.onPause();
        if (mIsRecordingVideo == true) {
            videoRecordingStop();                    
        }
    }

    private void videoRecordingStart() {
        CameraInfo camerainfo = new Camera.CameraInfo();
        for (int index = 0;
             index < Camera.getNumberOfCameras();
             index++) {
            Camera.getCameraInfo(index, camerainfo);
            if (camerainfo.facing ==
                    Camera.CameraInfo.CAMERA_FACING_FRONT) {
                try {
                    mCamera = Camera.open(index);
                    mCameraOrientation =
                        (camerainfo.orientation + 0) % 360;
                    mCameraOrientation =
                        (360 - mCameraOrientation);
                    mCamera.setDisplayOrientation(
                                mCameraOrientation);
                    Camera.Parameters cameraparameters =
                               mCamera.getParameters();
                    cameraparameters.setRotation(
                                         camerainfo.orientation);
                    mCamera.setParameters(cameraparameters);
                } catch (RuntimeException e) {
                    Log.i(mTAG, e.getMessage(), e);  
                }
            }
        }
        if (mCamera == null) {
            for (int index = 0;
                 index < Camera.getNumberOfCameras();
                 index++) {
                Camera.getCameraInfo(index, camerainfo);
                if (camerainfo.facing ==
                    Camera.CameraInfo.CAMERA_FACING_BACK) {
                    try {
                        mCamera = Camera.open(index);
                        mCameraOrientation =
                            (camerainfo.orientation + 0) % 360;
                        mCamera.setDisplayOrientation(
                                    mCameraOrientation);
                        Camera.Parameters cameraparameters =
                                   mCamera.getParameters();
                        cameraparameters.setRotation(
                                   camerainfo.orientation);
                        mCamera.setParameters(cameraparameters);
                    } catch (RuntimeException e) {
                        Log.i(mTAG, e.getMessage(), e);  
                    }
                }
            }
        }
       
        if (null != mCamera) {
            mCamera.startPreview();
            mCamera.unlock();
            mMediaRecorder = new MediaRecorder();
            mMediaRecorder.setCamera(mCamera);
            mMediaRecorder.setVideoSource(
                             MediaRecorder.VideoSource.CAMERA);
            mMediaRecorder.setAudioSource(
                             MediaRecorder.AudioSource.MIC);
            mMediaRecorder.setOutputFormat(
                             MediaRecorder.OutputFormat.MPEG_4);
            mMediaRecorder.setVideoEncoder(
                             MediaRecorder.VideoEncoder.H264);
            mMediaRecorder.setAudioEncoder(
                             MediaRecorder.AudioEncoder.AAC);
            String path = null;
            File dir = null;
            String name = null;
            try {
                path = String.format(getExternalFilesDir(null).
                           getPath().toString());
                dir = new File(path);
                if (!dir.exists())
                    dir.mkdirs();
                MP4FileFilter filter = new MP4FileFilter();
                File[] files = dir.listFiles(filter);
                if (files != null) {
                    for (File file : files) {
                        file.delete();
                    }
                }
                name = String.format("/%d.mp4",
                           System.currentTimeMillis());
            } catch(Exception e) {
                Log.i(mTAG, e.getMessage(), e);  
            }
            if ((path != null) && (name != null)) {
                mVideoRecordingPath = path + name;
                mMediaRecorder.setOutputFile(new File(path,
                                   name).getAbsolutePath());
                mMediaRecorder.setVideoSize(640, 480);
                mMediaRecorder.setVideoFrameRate(15);
                mMediaRecorder.setPreviewDisplay(
                    mPreview.getHolder().getSurface());
                mMediaRecorder.setOrientationHint(
                    mCameraOrientation);
          mMediaRecorder.setMaxDuration(60000);
             try {
                    mMediaRecorder.prepare();
                    mMediaRecorder.start();
                } catch (IllegalStateException e) {
                    Log.i(mTAG, e.getMessage(), e);  
                } catch (IOException e) {
                    Log.i(mTAG, e.getMessage(), e);  
                }
                mIsRecordingVideo = true;
            }
        }        
    }
   
    private class MP4FileFilter implements FileFilter {
        @Override
        public boolean accept(File pathname) {
            if (pathname.getName().toLowerCase().
                    endsWith(".mp4")) {
                return true;
            }
            return false;
        }
        
    }

    private void videoRecordingStop() {
        if (mIsRecordingVideo) {
            mMediaRecorder.stop();
            mCamera.stopPreview();
            mCamera.release();
            mMediaRecorder.release();
            SharedPreferences preferences =
                getApplicationContext().getSharedPreferences(
                    "VideoRecording", MODE_PRIVATE);
            Editor editor = preferences.edit();
            editor.putString("video_path", mVideoRecordingPath);
            AudioManager audioManager = (AudioManager)
                getApplicationContext().getSystemService(
                    Context.AUDIO_SERVICE);
            mVideoVolume = audioManager.getStreamVolume(
                               AudioManager.STREAM_MUSIC);
            editor.putInt("video_volume", mVideoVolume);
            editor.commit();
            mIsRecordingVideo = false;
            finish();
        }
    }
}


沒有留言:

張貼留言