1

iam using mediarecorder to record video in android application. I will start and stop recording video multiple times i will start recording on Action_down and stop on Action_up this is going on well and iam able to store and play video file in mobile . my problem is that since i have to start and stop recording video multiple times i can't use single output file becuase everytime it will get over written so everytime iam passing new file name and iam appending that to one outputfile everytime.iam getting every individual file and final outputfile in mobile but final file is having only what i have recorded for the first time because from second tab if see the file.mp4.length()is zero why it is ? anyone please try to help me. my code is as follows

package com.example.longtouch;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.net.rtp.AudioGroup;
import android.net.rtp.AudioStream;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Handler.Callback;
import android.provider.MediaStore.Audio;
import android.provider.MediaStore.Files;
import android.provider.MediaStore.Video;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;
import android.support.v4.app.NavUtils;

public class MainActivity extends Activity implements OnTouchListener{

    int i=1;
    File outputFile;
    File f1;
    File f2;


    MediaRecorder mediaRecorder; 
    ThreadProgress mThreadProgress;
    ThreadProgress2 mThreadProgress2;
    public int eventAction;

    Handler handler;
    Handler mHandler;

    Button myButton;
    FrameLayout myCameraPreview;
    Button submit;
    Button submit1;
    LinearLayout ll;
    ProgressBar progressBar;
     int progressStatus=0;

     MyCameraSurfaceView myCameraSurfaceView;
     Camera myCamera;

     boolean recording;




    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        recording=false;
        myButton=(Button)findViewById(R.id.button_capture);
        submit=(Button)findViewById(R.id.submit);
        submit1=(Button)findViewById(R.id.submit1);
        progressBar=(ProgressBar)findViewById(R.id.progress_bar);

        progressBar.setMax(10000);

        myCamera = getCameraInstance();
        if(myCamera == null){
         Toast.makeText(MainActivity.this,
           "Fail to get Camera",
           Toast.LENGTH_LONG).show();
        }
      // else
        //  myCamera.unlock();
        myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera);

        myCameraPreview=(FrameLayout)findViewById(R.id.camera_preview);
        myCameraPreview.addView(myCameraSurfaceView);
        ll=(LinearLayout)findViewById(R.id.ll);
        myCameraPreview.setOnTouchListener(this);   


      outputFile=new File("/sdcard/myvideo.mp4");
      if(outputFile.exists()){
          outputFile.delete();
          outputFile=new File("/sdcard/myvideo.mp4");
          try {
            outputFile.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
      }
      else{
           try {
            outputFile.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
      }

      f1=new File("/sdcard/myvideo1.mp4");
      if(f1.exists()){
          f1.delete();
          f1=new File("/sdcard/myvideo1.mp4");
          try{
              f1.createNewFile();
          }
          catch(Exception e){
              e.printStackTrace();
          }
      }
      else{
              try{
              f1.createNewFile();
          }
          catch(Exception e){
              e.printStackTrace();
          }
      }
      f2=new File("/sdcard/myvideo2.mp4");
      if(f2.exists()){
          f2.delete();
          f2=new File("/sdcard/myvideo2.mp4");
          try{
              f2.createNewFile();
          }
          catch(Exception e){
              e.printStackTrace();
          }
      }
      else{
              try{
              f2.createNewFile();
          }
          catch(Exception e){
              e.printStackTrace();
          }
      }




    }

  /*  public int getFrontCameraId() {
        CameraInfo ci = new CameraInfo();
        for (int i = 0 ; i < Camera.getNumberOfCameras(); i++) {
            Camera.getCameraInfo(i, ci);
            if (ci.facing == CameraInfo.CAMERA_FACING_FRONT) return i;
        }

        return -1; // No front-facing camera found
    }*/

    private Camera getCameraInstance(){
        // TODO Auto-generated method stub
              Camera c = null;
              try {
                 /* int index = getFrontCameraId();
                  if (index != -1)
                   c = Camera.open(index);*/
                  c = Camera.open(); // attempt to get a Camera instance
              }
              catch (Exception e){
                  // Camera is not available (in use or does not exist)
              }
              return c; // returns null if camera is unavailable
        }

    public void submit(View v){

     // stop recording and release camera
     // mediaRecorder.stop();  // stop the recording
    //  releaseMediaRecorder(); // release the MediaRecorder object
        Log.d("outputFile",""+f1.length());
      progressStatus=progressBar.getProgress();

      //Exit after saved
     // finish();
      myButton.setText("capture");

      recording=false;
      submit.setVisibility(View.GONE);
   }

   public void submit1(View v){

     // stop recording and release camera
    // mediaRecorder.stop();  // stop the recording
    // releaseMediaRecorder(); // release the MediaRecorder object

   progressBar.setProgress(0);
   progressStatus=0;
     //Exit after saved
    // finish();
     myButton.setText("capture");

     recording=false;
     submit1.setVisibility(View.GONE);
   }
   public void display(View v){
       Intent i=new Intent(this,VideoPlayer.class);
       startActivity(i);
   }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    public boolean onTouch(View arg0, final MotionEvent event) {
        // TODO Auto-generated method stub
         eventAction=event.getAction();
          switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN:
          {    
              i=i+1;
              Toast.makeText(getApplicationContext(),"action_down",Toast.LENGTH_SHORT).show();
              //releaseCamera();
              if(!prepareMediaRecorder()){
                  Toast.makeText(MainActivity.this,
                    "Fail in prepareMediaRecorder()!\n - Ended -",Toast.LENGTH_LONG).show();
                  finish();
                 }
            progressBar.setProgress(progressStatus);
             myButton.setText("STOP");

             try{
              mediaRecorder.start();
             }
             catch(Exception e){
                 e.printStackTrace();
                Log.d("vd","exception at start method");
             }
             if(f1.exists()){
             long l=f1.length();
             Log.d("start","started"+l);
             }
             if(f2.exists()){
             long m=f2.length();
             Log.d("start","started"+m);
             }


              recording = true;           


             if(progressBar.getProgress()>=5000){
                 mThreadProgress2=new ThreadProgress2();
                 mThreadProgress2.start();
             }

              mHandler = new Handler(new Callback() {

                    public boolean handleMessage(final Message msg) {
                        runOnUiThread(new Runnable() {
                             public void run() {
                                 if( event.getAction()!=MotionEvent.ACTION_UP){
                                 progressBar.setProgress(msg.arg1);

                             }
                                 if(progressBar.getProgress()==10000){
                                    Log.d("unicorn","1000");
                                     submit1.setVisibility(View.VISIBLE);

                                }


                             }
                         });
                        return false;
                    }
                });


              mThreadProgress=new ThreadProgress();
            mThreadProgress.start();

             handler = new Handler(new Callback() {

                public boolean handleMessage(final Message msg) {
                    runOnUiThread(new Runnable() {
                         public void run() {
                             if(  event.getAction()!=MotionEvent.ACTION_UP)
                             progressBar.setProgress(msg.arg1);
                             if(progressBar.getProgress()==5000){
                                 submit.setVisibility(View.VISIBLE);

                            }


                         }
                     });
                    return false;
                }
            });

            return true;
          }
          case MotionEvent.ACTION_UP:
          {    // nothing to do
            Toast.makeText(getApplicationContext(),"action_up",Toast.LENGTH_SHORT).show();
            myButton.setText("capture");


            mediaRecorder.stop();  // stop the recording
            releaseMediaRecorder(); // release the MediaRecorder object
           try {
            myCamera.reconnect();
           } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
           }


             //Exit after saved
            // finish();


             recording=false;
             progressStatus=progressBar.getProgress();


             if(i%2==0){
                    long len=f1.length();
                    Log.d("length",""+f1.getPath()+len);
                    Combine1 c1=new Combine1();
                   c1.start();             
             }
              else{
                   long len=f2.length();
                   Log.d("length",""+f2.getPath()+len);
                   Combine2 c2=new Combine2();
               c2.start();
              }           


            break;
          }
          default:
              return false;
      }

        return true;
    }


    private boolean prepareMediaRecorder(){


          // myCamera = getCameraInstance();
           mediaRecorder = new MediaRecorder();
           myCamera.stopPreview();

           myCamera.unlock();
           mediaRecorder.setCamera(myCamera);

           mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
           mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

           mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
         //  mediaRecorder.setVideoSize(400,400);

                if(i%2==0){
                 Log.d("outputfile",""+f1.getPath()+f1.length());
                 mediaRecorder.setOutputFile(f1.getPath());
                 Log.d("outputfile",""+f1.getPath()+f1.length());
               }
           else{
               Log.d("outputfile",""+f2.getPath()+f2.length());
               mediaRecorder.setOutputFile(f2.getPath());
               Log.d("outputfile",""+f2.getPath()+f2.length());
           }


           mediaRecorder.setMaxDuration(10000); // Set max duration 10 sec.

           mediaRecorder.setMaxFileSize(5000000); // Set max file size 5M
            //  mediaRecorder.setOnInfoListener(this);

           mediaRecorder.setPreviewDisplay(myCameraSurfaceView.getHolder().getSurface());


           try {
               mediaRecorder.prepare();
           } catch (IllegalStateException e) {
               Log.d("prepare","illegalstateexception");
               e.printStackTrace();
               releaseMediaRecorder();
               Toast.makeText(getApplicationContext(),"illegal state exception",Toast.LENGTH_SHORT).show();
               return false;
           } catch (IOException e) {
               Log.d("prepare","ioexception");
               e.printStackTrace();
               releaseMediaRecorder();
               Toast.makeText(getApplicationContext(),"IOexception",Toast.LENGTH_SHORT).show();
               return false;
           }
           Log.d("after prepare","after prepare f1"+f1.length());
           Log.d("after prepare","after prepare f2"+f2.length());

           return true;

        }

    public void combine(String file){
        Log.d("combine","combining"+file);
        try{
        File inputFile=new File(file);
        FileInputStream fis=new FileInputStream(inputFile);

        long inputlen=inputFile.length();
        Log.d("combine","lengthbefore write"+inputlen);

         File outputFile = new File("/sdcard/myvideo.mp4");
         FileOutputStream fos = new FileOutputStream(outputFile,true);


         byte fileContent[]= new byte[(int)inputFile.length()];
         fis.read(fileContent);

         long len=outputFile.length();
         Log.d("combine","lenth"+len);

         fos.write(fileContent);
         fis.close();


          fos.close();

          inputlen=inputFile.length();
          len=outputFile.length();
         Log.d("combine","inputlength"+inputlen);
         Log.d("combine","lenth"+len);

       /*  File f= new File(file); 
         boolean deleted = f.delete();

         if(deleted){
             Log.d("combine","deleted"+file); 
         } */

        }
        catch(Exception e){
            e.printStackTrace();

        }
    }

          @Override
          protected void onPause() {
              super.onPause();
              releaseMediaRecorder();      // if you are using MediaRecorder, release it first
              releaseCamera();            // release the camera immediately on pause event
          }

          private void releaseMediaRecorder(){
              if (mediaRecorder != null) {
                  mediaRecorder.reset();   // clear recorder configuration
                  mediaRecorder.release(); // release the recorder object
                  mediaRecorder = null;
                 // myCamera.lock();           // lock camera for later use
              }
          }

          private void releaseCamera(){
              if (myCamera != null){
                  myCamera.release();       // release the camera for other applications
                  myCamera = null;
              }
          }





    public class MyCameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback{

        private SurfaceHolder mHolder;
           private Camera mCamera;

        public MyCameraSurfaceView(Context context, Camera camera) {
               super(context);
               mCamera = camera;

               // Install a SurfaceHolder.Callback so we get notified when the
               // underlying surface is created and destroyed.
               mHolder = getHolder();
               mHolder.addCallback(this);
               // deprecated setting, but required on Android versions prior to 3.0
               mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
           }

        public void surfaceChanged(SurfaceHolder holder, int format, int weight,
          int height) {
               // If your preview can change or rotate, take care of those events here.
               // Make sure to stop the preview before resizing or reformatting it.

               if (mHolder.getSurface() == null){
                 // preview surface does not exist
                 return;
               }

               // stop preview before making changes
               try {
                   mCamera.stopPreview();
               } catch (Exception e){
                 // ignore: tried to stop a non-existent preview
               }

               // make any resize, rotate or reformatting changes here

               // start preview with new settings
               try {
                   mCamera.setPreviewDisplay(mHolder);
                   mCamera.startPreview();

               } catch (Exception e){
               }
        }

        public void surfaceCreated(SurfaceHolder holder) {
         // TODO Auto-generated method stub
         // The Surface has been created, now tell the camera where to draw the preview.
               try {
                   mCamera.setPreviewDisplay(holder);
                   mCamera.startPreview();
               } catch (IOException e) {
               }
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
         // TODO Auto-generated method stub

        }
        }

    public class ThreadProgress extends Thread implements Runnable {
        int progressValue=progressStatus;
        public void run() {

             while( progressBar.getProgress()<5000 && eventAction!=MotionEvent.ACTION_UP  ) {

                          Log.d("unicorn","in while loop"+progressValue);
                                  progressValue++;
                                  Message message = new Message();
                                  message.arg1 = progressValue;
                                  if(progressValue<=5000 && eventAction!=MotionEvent.ACTION_UP)
                                  handler.sendMessage(message);

                }

        }

    } 

    public class ThreadProgress2 extends Thread implements Runnable {
        int progressValue=progressStatus;
        @Override
        public void run() {

             while( progressBar.getProgress()<10000 && eventAction!=MotionEvent.ACTION_UP ) {
                     // try{

                          Log.d("unicorn2","in while loop"+progressValue);
                                  progressValue++;
                                  Message message = new Message();
                                  message.arg1 = progressValue;
                                  if(progressValue<=10000 && eventAction!=MotionEvent.ACTION_UP)
                                  mHandler.sendMessage(message);
                                  //Thread.sleep(1000);
                                //} catch (InterruptedException e){
                                      //  e.printStackTrace();
                                       // break;
                               // }
                }

        }



    } 

    public class Combine1 extends Thread implements Runnable{
        public void run(){
            try{
                int c;

            FileInputStream fin=new FileInputStream(f1);            

            FileOutputStream fout=new FileOutputStream(outputFile,true);


            long len1=f1.length();
            Log.d("length","myvideo1.mp4"+len1);
            long len2=outputFile.length();
            Log.d("length","myvideo.mp4"+len2);

            while((c=fin.read())!=-1){
                fout.write(c);
            }


            len2=outputFile.length();
            Log.d("length","myvideo.mp4"+len2);

            fin.close();
            fout.flush();
            fout.close();


            }
            catch(Exception e){
                e.printStackTrace();
            }

        }   


    }

    public class Combine2 extends Thread implements Runnable{
        public void run(){
            try{
            int j=0;
            FileInputStream fin=new FileInputStream(f2);            

            FileOutputStream fout=new FileOutputStream(outputFile,true);


            long len1=f2.length();
            Log.d("length","myvideo2.mp4"+len1);
            long len2=outputFile.length();
            Log.d("length","myvideo.mp4"+len2);

            while((j=fin.read())!=-1){
            fout.write(j);
            }
            len2=outputFile.length();
            Log.d("length","myvideo.mp4"+len2);


            fin.close();
            fout.flush();
            fout.close();   


            }
            catch(Exception e){
                e.printStackTrace();
            }

        }
    }   



}
MADHAVI M
  • 11
  • 1
  • 2

1 Answers1

0

In order to combine multiple video files you should use mp4parser library : https://mp4parser.googlecode.com/svn/trunk/examples/src/main/java/com/googlecode/mp4parser/AppendExample.java

Szabo Barna
  • 107
  • 1
  • 3