1

我正在使用 mediarecorder 在 android 应用程序中录制视频。我将多次开始和停止录制视频我将在 Action_down 上开始录制并在 Action_up 上停止这一切进展顺利,并且我能够在移动设备中存储和播放视频文件。我的问题是,由于我必须多次开始和停止录制视频,所以我不能使用单个输出文件,因为每次它都会被覆盖,所以每次我传递新文件名并将其附加到一个输出文件中。我得到每个人移动设备中的文件和最终输出文件,但最终文件只有我第一次记录的内容,因为从第二个选项卡中如果看到 file.mp4.length() 为零,为什么?任何人请尝试帮助我。我的代码如下

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();
            }

        }
    }   



}
4

1 回答 1

0

为了组合多个视频文件,您应该使用 mp4parser 库:https ://mp4parser.googlecode.com/svn/trunk/examples/src/main/java/com/googlecode/mp4parser/AppendExample.java

于 2013-07-30T13:37:39.910 回答