아래의 코드는 SurfaceView를 사용하여 미리보기를 하고,

동영상을 녹화하는 코드입니다.

 

제가 지금 구현하고 싶은것은 가속도 센서가 일정한 범위 이상의 흔들림이 발생 했을때,

흔들림이 발생한 시간 전 4분부터 흔들림이 발생한 후 1분까지 총 5분의 동영상만 따로 저장하는 방법을 알고 싶습니다.

가속도 흔들림에 관련된 코드는 완성이 되었고,

가속도 흔들림이 발생할 때 동영상 녹화를 종료하고, 파일로 만드는 작업은 성공하였습니다. 

 

학교 과제로 블랙박스 어플을 만들고 있는데, 운전 시작부터 끝까지 녹화는 간단하게 구현하였는데,

사고 발생 부분만 따로 저장하고 싶은데, 어떻게 해야할지 모르겠습니다.

 

한개의 파일은 처음부터 끝까지 녹화된 파일이고,

다른 한개는 가속도 센서의 흔들림이 발생한 부분의 영상만 있는 파일로 만들고 싶습니다.

어디부분에 어떤 코드를 작성하면 되는지 몇일째 고민하고, 책을 찾아봐도 못하고 있습니다.

 

혹시 방법을 아신다면 조금 도와주세요.ㅜㅜ

 

 

비디오 녹화
public class main extends Activity { 
 // 동영상 녹화를 위한 변수 선언.
 private static final int STATE_IDLE = 0;  // 촬영 구분을 위한 변수
 private static final int STATE_RECORDING = 1; // 중지
 
 
 private static int RECORDING_STATE = STATE_IDLE; // 최초 버튼 클릭시 촬영 모드로 가기 위한 변수 선언.
     private Preview mPreview;      // 화면에 뿌려주는 영역 선언.
 private Button takeVideoButton;     // 녹화 버튼 -> 클릭하면 종료 버튼으로 변경.
비디오 녹화
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);       
      
        mPreview = new Preview(this);
               
        LayoutInflater inflater = getLayoutInflater();
        RelativeLayout rl = (RelativeLayout)inflater.inflate(R.layout.main, null);
        
        takeVideoButton = (Button)rl.findViewById(R.id.cameraButton);
        takeVideoButton.setOnClickListener(new OnClickListener(){
                      @Override
                       public void onClick(View v) {
                                mPreview.procVideo(RECORDING_STATE);
                        }
           });

        FrameLayout fl = new FrameLayout(this);
        fl.addView(mPreview);
        fl.addView(rl);
        setContentView(fl);
  }
비디오 녹화
/*
 * Preview Class.
 * 화면에 뿌려줄 내용과 녹화에 관한 class    
 */
    class Preview extends SurfaceView implements SurfaceHolder.Callback {
        SurfaceHolder mHolder;
        Camera mCamera;
        Context mCtx;
        MediaRecorder mRecorder; 
        
        String filePath;
        File videoFile = null;
       
        Preview(Context context) {
            super(context);
            mCtx = context;
            mHolder = getHolder();
            mHolder.addCallback(this);
            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }
비디오 녹화
        public void surfaceCreated(SurfaceHolder holder) {
            mCamera = Camera.open();
            try {
               mCamera.setPreviewDisplay(holder);
            } catch (IOException exception) {
                mCamera.release();
                mCamera = null;
            }
        }
        
        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
         Camera.Parameters parameters = mCamera.getParameters();
            parameters.setPreviewSize(320, 240);
            mCamera.setParameters(parameters);
            mCamera.startPreview();
        }
비디오 녹화
        public void surfaceDestroyed(SurfaceHolder holder) {
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
        }
        
        private void initRecorder(){
          filePath = Environment           
                                          .getExternalStorageDirectory()
                                          .getPath()+ "/" + createName(System.currentTimeMillis());
                 try {
                            videoFile = new File(filePath);
                             videoFile.createNewFile();
                       } 
                      catch (IOException e){
                      e.printStackTrace();
                }
   
             mRecorder = new MediaRecorder();
        
             mCamera.unlock();
             mRecorder.setCamera(mCamera);
         
             mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
             mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
          
             mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
           
             mRecorder.setVideoSize(320, 240);
             mRecorder.setVideoFrameRate(15);
            
             mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
             mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
            
             mRecorder.setPreviewDisplay(mHolder.getSurface());
             mRecorder.setOutputFile(filePath);           
            
             try {
                          mRecorder.prepare();
                } 
                  catch (IllegalStateException e) {
                                  e.printStackTrace();
                      } 
                   catch (IOException e) {
                                   e.printStackTrace();
                      } 
         }
        
         private String createName(long dateTaken){
         Date date = new Date(dateTaken);
         SimpleDateFormat dateFormat = 
          new SimpleDateFormat("사고 yyyy-MM-dd HH.mm.ss");   // 저장하는 파일 명.
         return dateFormat.format(date)+".3gp";
         }
        
         private void registerVideo(){
         ContentValues values = new ContentValues();
         values.put(Video.Media.TITLE, "Test video");
         values.put(Video.Media.DISPLAY_NAME, videoFile.getName());
         values.put(Video.Media.DATE_TAKEN, System.currentTimeMillis());
         values.put(Video.Media.MIME_TYPE, "video/3gp");
         values.put(Video.Media.DATA, videoFile.getPath());
         values.put(Video.Media.SIZE, videoFile.length());
         mCtx.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
         Toast.makeText(main.this, "비디오가 저장되었습니다.", Toast.LENGTH_SHORT).show();
         }
        
         public void procVideo(int state){
             switch(state){
                 case STATE_IDLE:
                           initRecorder();
                           mRecorder.start();
                           RECORDING_STATE = STATE_RECORDING;
                           takeVideoButton.setText("중지");                    // 촬영 버튼을 정지 버튼으로 변경.
                    break;
          
                    case STATE_RECORDING:
                           mRecorder.stop();
                          RECORDING_STATE = STATE_IDLE;
                          mRecorder.release();
                          registerVideo();
                          mCamera.lock();
                         takeVideoButton.setText("촬영");          // 정지 버튼을 촬영 보튼으로 변경.
                     break;              
                 }
           }
      }
}