Android 行车记录循环录制保存最新10h视频

版权声明:注明转载出处 https://blog.csdn.net/qq_38629981/article/details/80241699

文章只提供样例,思路,因其中的jar包,包括打开Camera的方式,都是配合开发板而定,文中打开Camera为四路通道,Camera.open(4);  Camera.open(5);  Camera.open(6);  Camera.open(7);

com.xw.Camera;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;


import android.app.Activity;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.Size;
import android.media.CamcorderProfile;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.os.StatFs;
import android.util.Log;
import android.view.TextureView;
import android.view.TextureView.SurfaceTextureListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;

import com.cosofteck.rkdevlib.Tvin;


@SuppressWarnings("deprecation")
public class MainActivity extends Activity implements SurfaceTextureListener, OnClickListener {


    private static final String TAG         = "MainActivity ";
    private Camera              mCamera0, mCamera1, mCamera2, mCamera3;
    private TextureView         mTextureView0, mTextureView1, mTextureView2, mTextureView3;
    private ImageView           mRecordImage0, mRecordImage1, mRecordImage2, mRecordImage3;
    private ImageButton         mFrontButton, mBehindButton, mLeftButton, mRightButton, mAllButton;
    private boolean             isRecord0   = false, isRecord1 = false, isRecord2 = false, isRecord3 = false;
    private boolean             isPreview0  = false, isPreview1 = false, isPreview2 = false, isPreview3 = false;
    private MediaRecorder       mMediaRecorder0, mMediaRecorder1, mMediaRecorder2, mMediaRecorder3;


    private Tvin                mTvin;
    private ReadSignalThread    mReadSignalThread;
    private boolean             isReading   = false;
    static final private int    NO_SIGNAL_0 = 0;
    static final private int    BE_SIGNAL_0 = 1;
    static final private int    NO_SIGNAL_1 = 2;
    static final private int    BE_SIGNAL_1 = 3;
    static final private int    NO_SIGNAL_2 = 4;
    static final private int    BE_SIGNAL_2 = 5;
    static final private int    NO_SIGNAL_3 = 6;
    static final private int    BE_SIGNAL_3 = 7;
    // ---------------------------------------------------------------
    private int                 recLen0     = 1 * 10;                                                           // 默认10s后开始录制
    Handler                     handler     = new Handler();
    String                      SDCardPath  = "/mnt/sdcard/";
    String                      videopath   = Environment.getExternalStorageDirectory() + "/Movies/";
    String                      filePath    = Environment.getExternalStorageDirectory() + "/Movies/";


    // ----------------------------------------------------------


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mFrontButton = (ImageButton) findViewById(R.id.front);
        mFrontButton.setOnClickListener(this);
        mBehindButton = (ImageButton) findViewById(R.id.behind);
        mBehindButton.setOnClickListener(this);
        mLeftButton = (ImageButton) findViewById(R.id.left);
        mLeftButton.setOnClickListener(this);
        mRightButton = (ImageButton) findViewById(R.id.right);
        mRightButton.setOnClickListener(this);
        mAllButton = (ImageButton) findViewById(R.id.all);
        mAllButton.setOnClickListener(this);


        mRecordImage0 = (ImageView) findViewById(R.id.record0);
        mRecordImage1 = (ImageView) findViewById(R.id.record1);
        mRecordImage2 = (ImageView) findViewById(R.id.record2);
        mRecordImage3 = (ImageView) findViewById(R.id.record3);


        mTextureView0 = ((TextureView) findViewById(R.id.textureview0));
        mTextureView0.setSurfaceTextureListener(this);
        mTextureView0.setOnClickListener(this);


        mTextureView1 = ((TextureView) findViewById(R.id.textureview1));
        mTextureView1.setSurfaceTextureListener(this);
        mTextureView1.setOnClickListener(this);


        mTextureView2 = ((TextureView) findViewById(R.id.textureview2));
        mTextureView2.setSurfaceTextureListener(this);
        mTextureView2.setOnClickListener(this);


        mTextureView3 = ((TextureView) findViewById(R.id.textureview3));
        mTextureView3.setSurfaceTextureListener(this);
        mTextureView3.setOnClickListener(this);


        mReadSignalThread = new ReadSignalThread();
        isReading = true;
        mReadSignalThread.start();
        // -------------------------------------------
        // 检测有无SD卡
        // scannerSD();
        // 检测SD卡的总大小
        // getSDTotalSize(SDCardPath);
        // 检测SD卡剩余容量
        // getSDAvailableSize(SDCardPath);


        // 遍历指定目录下的所有文件,删除最新创建的
        // deleteFromFloder(filePath);
        // 遍历文件,获取所有视频时长总和
        // getVideoTime(filePath);
    }


    // -----------------------------------------------
    @Override
    protected void onStop() {
        isReading = false;


        if (mMediaRecorder0 != null) {
            mMediaRecorder0.stop();
            releaseMediaRecorder0();
        }


        if (mMediaRecorder1 != null) {
            mMediaRecorder1.stop();
            releaseMediaRecorder1();
        }


        if (mMediaRecorder2 != null) {
            mMediaRecorder2.stop();
            releaseMediaRecorder2();
        }


        if (mMediaRecorder3 != null) {
            mMediaRecorder3.stop();
            releaseMediaRecorder3();
        }


        if (mCamera0 != null) {
            mCamera0.stopPreview();
            isPreview0 = false;
            mCamera0.release();
            mCamera0 = null;
        }


        if (mCamera1 != null) {
            mCamera1.stopPreview();
            isPreview1 = false;
            mCamera1.release();
            mCamera1 = null;
        }


        if (mCamera2 != null) {
            mCamera2.stopPreview();
            isPreview2 = false;
            mCamera2.release();
            mCamera2 = null;
        }


        if (mCamera3 != null) {
            mCamera3.stopPreview();
            isPreview3 = false;
            mCamera3.release();
            mCamera3 = null;
        }


        super.onStop();
    }


    // 判断摄像头有无信号
    Handler MyHandler = new Handler() {


                          // @Override
                          public void handleMessage(Message msg) { // 处理消息
                              switch (msg.what) {
                                  case NO_SIGNAL_0: {
                                      if (mMediaRecorder0 != null) {
                                          mMediaRecorder0.stop();
                                          releaseMediaRecorder0();
                                      }
                                      if (mCamera0 != null) {
                                          mCamera0.stopPreview();
                                          isPreview0 = false;
                                      }


                                  }
                                      break;
                                  case BE_SIGNAL_0: {
                                      if (mCamera0 != null) {
                                          mCamera0.startPreview();
                                          isPreview0 = true;
                                      }
                                  }
                                      break;
                                  case NO_SIGNAL_1: {
                                      if (mMediaRecorder1 != null) {
                                          mMediaRecorder1.stop();
                                          releaseMediaRecorder1();
                                      }
                                      if (mCamera1 != null) {
                                          mCamera1.stopPreview();
                                          isPreview1 = false;
                                      }


                                  }
                                      break;
                                  case BE_SIGNAL_1: {
                                      if (mCamera1 != null) {
                                          mCamera1.startPreview();
                                          isPreview1 = true;
                                      }
                                  }
                                      break;
                                  case NO_SIGNAL_2: {
                                      if (mMediaRecorder2 != null) {
                                          mMediaRecorder2.stop();
                                          releaseMediaRecorder2();
                                      }
                                      if (mCamera2 != null) {
                                          mCamera2.stopPreview();
                                          isPreview2 = false;
                                      }


                                  }
                                      break;
                                  case BE_SIGNAL_2: {
                                      if (mCamera2 != null) {
                                          mCamera2.startPreview();
                                          isPreview2 = true;
                                      }
                                  }
                                      break;
                                  case NO_SIGNAL_3: {
                                      if (mMediaRecorder3 != null) {
                                          mMediaRecorder3.stop();
                                          releaseMediaRecorder3();
                                      }
                                      if (mCamera3 != null) {
                                          mCamera3.stopPreview();
                                          isPreview3 = false;
                                      }


                                  }
                                      break;
                                  case BE_SIGNAL_3: {
                                      if (mCamera3 != null) {
                                          mCamera3.startPreview();
                                          isPreview3 = true;
                                      }
                                  }
                                      break;
                              }
                          }
                      };


    class ReadSignalThread extends Thread {


        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
            while (isReading) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


                if (mTvin.ReadSignal(0) == 0) // no signal
                {
                    if (isPreview0) {
                        Message msg = Message.obtain();
                        msg.what = NO_SIGNAL_0;
                        MyHandler.sendMessage(msg);
                    }
                } else {
                    if (!isPreview0) {
                        Message msg = Message.obtain();
                        msg.what = BE_SIGNAL_0;
                        MyHandler.sendMessage(msg);
                    }
                }


                if (mTvin.ReadSignal(1) == 0) // no signal
                {
                    if (isPreview1) {
                        Message msg = Message.obtain();
                        msg.what = NO_SIGNAL_1;
                        MyHandler.sendMessage(msg);
                    }
                } else {
                    if (!isPreview1) {
                        Message msg = Message.obtain();
                        msg.what = BE_SIGNAL_1;
                        MyHandler.sendMessage(msg);
                    }
                }


                if (mTvin.ReadSignal(2) == 0) // no signal
                {
                    if (isPreview2) {
                        Message msg = Message.obtain();
                        msg.what = NO_SIGNAL_2;
                        MyHandler.sendMessage(msg);
                    }
                } else {
                    if (!isPreview2) {
                        Message msg = Message.obtain();
                        msg.what = BE_SIGNAL_2;
                        MyHandler.sendMessage(msg);
                    }
                }


                if (mTvin.ReadSignal(3) == 0) // no signal
                {
                    if (isPreview3) {
                        Message msg = Message.obtain();
                        msg.what = NO_SIGNAL_3;
                        MyHandler.sendMessage(msg);
                    }
                } else {
                    if (!isPreview3) {
                        Message msg = Message.obtain();
                        msg.what = BE_SIGNAL_3;
                        MyHandler.sendMessage(msg);
                    }
                }
            }
        }
    }


    /**
     * @author Administrator 开机测试
     */
    @Override
    // public void onSurfaceTextureAvailable( SurfaceTexture surface, int width, int height) {
    public void onSurfaceTextureAvailable(final SurfaceTexture surface, int width, int height) {
        if (surface == mTextureView0.getSurfaceTexture()) {
            mCamera0 = Camera.open(4);
            mCamera0.setDisplayOrientation(0);
            if (mCamera0 != null) {
                try {
                    mCamera0.setPreviewTexture(surface);
                    mCamera0.startPreview();
                    isPreview0 = true;


                    // 在此开启视频录制
                    // handler.postDelayed(runnable0, 1000);


                } catch (IOException e) {
                    Log.d(TAG, "mCamera0 = " + e.getMessage());
                }
            }
        } else if (surface == mTextureView1.getSurfaceTexture()) {
            mCamera1 = Camera.open(5);
            mCamera1.setDisplayOrientation(0);
            if (mCamera1 != null) {
                try {
                    mCamera1.setPreviewTexture(surface);
                    mCamera1.startPreview();
                    isPreview1 = true;
                    // 在此开启视频录制


                    // handler.postDelayed(runnable1, 1000); // 定时器 2S


                } catch (Exception e) {
                    Log.d(TAG, "mCamera1 = " + e.getMessage());
                }
            }
        } else if (surface == mTextureView2.getSurfaceTexture()) {
            mCamera2 = Camera.open(6);
            mCamera2.setDisplayOrientation(0);
            if (mCamera2 != null) {
                try {
                    mCamera2.setPreviewTexture(surface);
                    mCamera2.startPreview();
                    isPreview2 = true;


                    // 在此开启视频录制
                    // new MediaPrepareTask2().execute(null, null, null);


                } catch (IOException e) {
                    Log.d(TAG, "mCamera2 = " + e.getMessage());
                }
            }
        } else if (surface == mTextureView3.getSurfaceTexture()) {
            mCamera3 = Camera.open(7);
            mCamera3.setDisplayOrientation(0);
            if (mCamera3 != null) {
                try {
                    mCamera3.setPreviewTexture(surface);
                    mCamera3.startPreview();
                    isPreview3 = true;


                    // 在此开启视频录制
                    // new MediaPrepareTask3().execute(null, null, null);


                } catch (IOException e) {
                    Log.d(TAG, "mCamera3 = " + e.getMessage());
                }
            }
        }
    }


    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {


    }


    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {


        return false;
    }


    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {


    }


    @Override
    public void onClick(View v) {
        if (v == mFrontButton) {
            mFrontButton.setSelected(true);
            mBehindButton.setSelected(false);
            mLeftButton.setSelected(false);
            mRightButton.setSelected(false);
            mAllButton.setSelected(false);


            mTextureView0.setVisibility(View.VISIBLE);
            if (isRecord0 == true) {
                mRecordImage0.setVisibility(View.VISIBLE);
            }


            mTextureView1.setVisibility(View.GONE);
            mRecordImage1.setVisibility(View.GONE);
            mTextureView2.setVisibility(View.GONE);
            mRecordImage2.setVisibility(View.GONE);
            mTextureView3.setVisibility(View.GONE);
            mRecordImage3.setVisibility(View.GONE);
        } else if (v == mBehindButton) {
            mFrontButton.setSelected(false);
            mBehindButton.setSelected(true);
            mLeftButton.setSelected(false);
            mRightButton.setSelected(false);
            mAllButton.setSelected(false);


            mTextureView0.setVisibility(View.GONE);
            mRecordImage0.setVisibility(View.GONE);
            mTextureView1.setVisibility(View.VISIBLE);
            if (isRecord1 == true) {
                mRecordImage1.setVisibility(View.VISIBLE);
            }
            mTextureView2.setVisibility(View.GONE);
            mRecordImage2.setVisibility(View.GONE);
            mTextureView3.setVisibility(View.GONE);
            mRecordImage3.setVisibility(View.GONE);
        } else if (v == mLeftButton) {
            mFrontButton.setSelected(false);
            mBehindButton.setSelected(false);
            mLeftButton.setSelected(true);
            mRightButton.setSelected(false);
            mAllButton.setSelected(false);


            mTextureView0.setVisibility(View.GONE);
            mRecordImage0.setVisibility(View.GONE);
            mTextureView1.setVisibility(View.GONE);
            mRecordImage1.setVisibility(View.GONE);
            mTextureView2.setVisibility(View.VISIBLE);
            if (isRecord2 == true) {
                mRecordImage2.setVisibility(View.VISIBLE);
            }
            mTextureView3.setVisibility(View.GONE);
            mRecordImage3.setVisibility(View.GONE);
        } else if (v == mRightButton) {
            mFrontButton.setSelected(false);
            mBehindButton.setSelected(false);
            mLeftButton.setSelected(false);
            mRightButton.setSelected(true);
            mAllButton.setSelected(false);


            mTextureView0.setVisibility(View.GONE);
            mRecordImage0.setVisibility(View.GONE);
            mTextureView1.setVisibility(View.GONE);
            mRecordImage1.setVisibility(View.GONE);
            mTextureView2.setVisibility(View.GONE);
            mRecordImage2.setVisibility(View.GONE);
            mTextureView3.setVisibility(View.VISIBLE);
            if (isRecord3 == true) {
                mRecordImage3.setVisibility(View.VISIBLE);
            }
        } else if (v == mAllButton) {
            mFrontButton.setSelected(false);
            mBehindButton.setSelected(false);
            mLeftButton.setSelected(false);
            mRightButton.setSelected(false);
            mAllButton.setSelected(true);


            mTextureView0.setVisibility(View.VISIBLE);
            if (isRecord0 == true) {
                mRecordImage0.setVisibility(View.VISIBLE);
            }
            mTextureView1.setVisibility(View.VISIBLE);
            if (isRecord1 == true) {
                mRecordImage1.setVisibility(View.VISIBLE);
            }
            mTextureView2.setVisibility(View.VISIBLE);
            if (isRecord2 == true) {
                mRecordImage2.setVisibility(View.VISIBLE);
            }
            mTextureView3.setVisibility(View.VISIBLE);
            if (isRecord3 == true) {
                mRecordImage3.setVisibility(View.VISIBLE);
            }
        } else if (v == mTextureView0) {
            if (mCamera0 == null) {
                return;
            }
            if (isRecord0) {
                if (mMediaRecorder0 != null) {
                    mMediaRecorder0.stop();
                    releaseMediaRecorder0();
                    isRecord0 = false;
                    mRecordImage0.setVisibility(View.GONE);
                }
            } else {
                mRecordImage0.setVisibility(View.VISIBLE);
                new MediaPrepareTask0().execute(null, null, null);
            }
        } else if (v == mTextureView1) {
            if (mCamera1 == null) {
                return;
            }
            if (isRecord1) {
                if (mMediaRecorder1 != null) {
                    mMediaRecorder1.stop();
                    releaseMediaRecorder1();
                    isRecord1 = false;
                    mRecordImage1.setVisibility(View.GONE);
                }
            } else {
                mRecordImage1.setVisibility(View.VISIBLE);
                new MediaPrepareTask1().execute(null, null, null);
            }
        } else if (v == mTextureView2) {
            if (mCamera2 == null) {
                return;
            }
            if (isRecord2) {
                if (mMediaRecorder2 != null) {
                    mMediaRecorder2.stop();
                    releaseMediaRecorder2();
                    isRecord2 = false;
                    mRecordImage2.setVisibility(View.GONE);
                }
            } else {
                mRecordImage2.setVisibility(View.VISIBLE);
                new MediaPrepareTask2().execute(null, null, null);
            }
        } else if (v == mTextureView3) {
            if (mCamera3 == null) {
                return;
            }
            if (isRecord3) {
                if (mMediaRecorder3 != null) {
                    mMediaRecorder3.stop();
                    releaseMediaRecorder3();
                    isRecord3 = false;
                    mRecordImage3.setVisibility(View.GONE);
                }
            } else {
                mRecordImage3.setVisibility(View.VISIBLE);
                new MediaPrepareTask3().execute(null, null, null);
            }
        }
    }


    private boolean prepareVideoRecorder0() {
        // CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
        CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_1080P);
        Parameters parameters = mCamera0.getParameters();
        List<Size> previewSizes = parameters.getSupportedPreviewSizes();
        Size size = previewSizes.get(0);
        camcorderProfile.videoFrameWidth = size.width;
        camcorderProfile.videoFrameHeight = size.height;


        if (mMediaRecorder0 == null) {
            mMediaRecorder0 = new MediaRecorder();
        }


        try {
            mCamera0.unlock();// 注意处,一定要调用此方法,否则会崩溃.
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
            if (mCamera0 != null) {
                mCamera0.stopPreview();
                isPreview0 = false;
                mCamera0.release();
                mCamera0 = null;
            }
            return false;
        }


        mMediaRecorder0.setCamera(mCamera0);// 注意顺序


        mMediaRecorder0.setVideoSource(MediaRecorder.VideoSource.CAMERA);


        mMediaRecorder0.setOutputFormat(camcorderProfile.fileFormat); // 输出格式
        mMediaRecorder0.setVideoEncodingBitRate(camcorderProfile.videoBitRate); // bit
        mMediaRecorder0.setVideoFrameRate(camcorderProfile.videoFrameRate); // 视频帧率
        mMediaRecorder0.setVideoSize(camcorderProfile.videoFrameWidth, camcorderProfile.videoFrameHeight); // 视频尺寸
        mMediaRecorder0.setVideoEncoder(camcorderProfile.videoCodec); // 编码方式


        mMediaRecorder0.setOutputFile(generateVideoFilename(0)); // 保存路径
        mMediaRecorder0.setMaxDuration(300000); // 录制最大时间设置
        try {
            mMediaRecorder0.prepare();
        } catch (IllegalStateException e) {
            Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
            releaseMediaRecorder0();
            return false;
        } catch (IOException e) {
            Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
            releaseMediaRecorder0();
            return false;
        }
        return true;
    }


    private boolean prepareVideoRecorder1() {
        CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
        // CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_1080P);
        Parameters parameters = mCamera1.getParameters(); // 得到摄像头的参数
        List<Size> previewSizes = parameters.getSupportedPreviewSizes(); // 设置预览大小
        Size size = previewSizes.get(0);
        camcorderProfile.videoFrameWidth = size.width;
        camcorderProfile.videoFrameHeight = size.height;


        if (mMediaRecorder1 == null) {
            mMediaRecorder1 = new MediaRecorder();
        }


        try {
            mCamera1.unlock();// 注意处,一定要调用此方法,否则会崩溃.
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
            if (mCamera1 != null) {
                mCamera1.stopPreview();
                isPreview1 = false;
                mCamera1.release();
                mCamera1 = null;
            }
            return false;
        }


        mMediaRecorder1.setCamera(mCamera1);// 注意顺序


        mMediaRecorder1.setVideoSource(MediaRecorder.VideoSource.CAMERA);


        mMediaRecorder1.setOutputFormat(camcorderProfile.fileFormat);
        mMediaRecorder1.setVideoEncodingBitRate(camcorderProfile.videoBitRate);
        mMediaRecorder1.setVideoFrameRate(camcorderProfile.videoFrameRate);
        mMediaRecorder1.setVideoSize(camcorderProfile.videoFrameWidth, camcorderProfile.videoFrameHeight);
        mMediaRecorder1.setVideoEncoder(camcorderProfile.videoCodec);


        mMediaRecorder1.setMaxDuration(1 * 60 * 1000); // 1min
        // 写入之前可以判断有无sd卡,剩余空间等
        mMediaRecorder1.setOutputFile(generateVideoFilename(1)); // 写入文件夹
        try {
            mMediaRecorder1.prepare();


        } catch (IllegalStateException e) {
            Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
            releaseMediaRecorder1();
            return false;
        } catch (IOException e) {
            Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
            releaseMediaRecorder1();
            return false;
        }
        return true;
    }


    private boolean prepareVideoRecorder2() {
        CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
        // CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_1080P);
        Parameters parameters = mCamera2.getParameters();
        List<Size> previewSizes = parameters.getSupportedPreviewSizes();
        Size size = previewSizes.get(0);
        camcorderProfile.videoFrameWidth = size.width;
        camcorderProfile.videoFrameHeight = size.height;


        if (mMediaRecorder2 == null) {
            mMediaRecorder2 = new MediaRecorder();
        }


        try {
            mCamera2.unlock();// 注意处,一定要调用此方法,否则会崩溃.
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
            if (mCamera2 != null) {
                mCamera2.stopPreview();
                isPreview2 = false;
                mCamera2.release();
                mCamera2 = null;
            }
            return false;
        }


        mMediaRecorder2.setCamera(mCamera2);// 注意顺序


        mMediaRecorder2.setVideoSource(MediaRecorder.VideoSource.CAMERA);


        mMediaRecorder2.setOutputFormat(camcorderProfile.fileFormat);
        mMediaRecorder2.setVideoEncodingBitRate(camcorderProfile.videoBitRate);
        mMediaRecorder2.setVideoFrameRate(camcorderProfile.videoFrameRate);
        mMediaRecorder2.setVideoSize(camcorderProfile.videoFrameWidth, camcorderProfile.videoFrameHeight);
        mMediaRecorder2.setVideoEncoder(camcorderProfile.videoCodec);


        mMediaRecorder2.setOutputFile(generateVideoFilename(2));
        mMediaRecorder2.setMaxDuration(300000);
        try {
            mMediaRecorder2.prepare();
        } catch (IllegalStateException e) {
            Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
            releaseMediaRecorder2();
            return false;
        } catch (IOException e) {
            Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
            releaseMediaRecorder2();
            return false;
        }
        return true;
    }


    private boolean prepareVideoRecorder3() {
        CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
        // CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_1080P);
        Parameters parameters = mCamera3.getParameters();
        List<Size> previewSizes = parameters.getSupportedPreviewSizes();
        Size size = previewSizes.get(0);
        camcorderProfile.videoFrameWidth = size.width;
        camcorderProfile.videoFrameHeight = size.height;


        if (mMediaRecorder3 == null) {
            mMediaRecorder3 = new MediaRecorder();
        }


        try {
            mCamera3.unlock();// 注意处,一定要调用此方法,否则会崩溃.
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
            if (mCamera3 != null) {
                mCamera3.stopPreview();
                isPreview3 = false;
                mCamera3.release();
                mCamera3 = null;
            }
            return false;
        }


        mMediaRecorder3.setCamera(mCamera3);// 注意顺序


        mMediaRecorder3.setVideoSource(MediaRecorder.VideoSource.CAMERA);


        mMediaRecorder3.setOutputFormat(camcorderProfile.fileFormat);
        mMediaRecorder3.setVideoEncodingBitRate(camcorderProfile.videoBitRate);
        mMediaRecorder3.setVideoFrameRate(camcorderProfile.videoFrameRate);
        mMediaRecorder3.setVideoSize(camcorderProfile.videoFrameWidth, camcorderProfile.videoFrameHeight);
        mMediaRecorder3.setVideoEncoder(camcorderProfile.videoCodec);


        mMediaRecorder3.setOutputFile(generateVideoFilename(3));
        mMediaRecorder3.setMaxDuration(300000);
        try {
            mMediaRecorder3.prepare();
        } catch (IllegalStateException e) {
            Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
            releaseMediaRecorder3();
            return false;
        } catch (IOException e) {
            Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
            releaseMediaRecorder3();
            return false;
        }
        return true;
    }


    /**
     * Asynchronous task for preparing the {@link android.media.MediaRecorder} since it's a long blocking operation.
     */
    class MediaPrepareTask0 extends AsyncTask<Void, Void, Boolean> {


        @Override
        protected Boolean doInBackground(Void... voids) {
            // initialize video camera
//          每次写入文件前,获取文件夹所有视频的时长总和
            getVideoTime(filePath);
            if (prepareVideoRecorder0()) {
                // Camera is available and unlocked, MediaRecorder is prepared,
                // now you can start recording
                isRecord0 = true;
                mMediaRecorder0.start();


                Log.d(TAG,"front录制END.....");


            } else {
                // prepare didn't work, release the camera
                releaseMediaRecorder0();
                return false;
            }
            return true;
        }


        @Override
        protected void onPostExecute(Boolean result) {
            if (!result) {
                MainActivity.this.finish();
            }
        }
    }


    class MediaPrepareTask1 extends AsyncTask<Void, Void, Boolean> {


        @Override
        protected Boolean doInBackground(Void... voids) {
            // initialize video camera
//          每次写入文件前,获取文件夹所有视频的时长总和
            getVideoTime(filePath);
            if (prepareVideoRecorder1()) {
                // Camera is available and unlocked, MediaRecorder is prepared,
                // now you can start recording
                isRecord1 = true;
                mMediaRecorder1.start();


                Log.d(TAG,"behind录制END.....");


            } else {
                // prepare didn't work, release the camera
                releaseMediaRecorder1();
                return false;
            }
            return true;
        }


        @Override
        protected void onPostExecute(Boolean result) {
            if (!result) {
                MainActivity.this.finish();
            }
        }
    }


    class MediaPrepareTask2 extends AsyncTask<Void, Void, Boolean> {


        @Override
        protected Boolean doInBackground(Void... voids) {
            // initialize video camera
            if (prepareVideoRecorder2()) {
                // Camera is available and unlocked, MediaRecorder is prepared,
                // now you can start recording
                isRecord2 = true;
                mMediaRecorder2.start();
            } else {
                // prepare didn't work, release the camera
                releaseMediaRecorder2();
                return false;
            }
            return true;
        }


        @Override
        protected void onPostExecute(Boolean result) {
            if (!result) {
                MainActivity.this.finish();
            }
        }
    }


    class MediaPrepareTask3 extends AsyncTask<Void, Void, Boolean> {


        @Override
        protected Boolean doInBackground(Void... voids) {
            // initialize video camera
            if (prepareVideoRecorder3()) {
                // Camera is available and unlocked, MediaRecorder is prepared,
                // now you can start recording
                isRecord3 = true;
                mMediaRecorder3.start();
            } else {
                // prepare didn't work, release the camera
                releaseMediaRecorder3();
                return false;
            }
            return true;
        }


        @Override
        protected void onPostExecute(Boolean result) {
            if (!result) {
                MainActivity.this.finish();
            }
        }
    }


    private String generateVideoFilename(int direction) {
        long dateTaken = System.currentTimeMillis();
        String title = createName(dateTaken);
        // String filename = title + ".mp4";
        String filename = System.currentTimeMillis() + ".mp4";  //文件名为,当前的时间(ms)


        switch (direction) {
            case 0:// front
                filename = "" + filename;
                break;
            case 1:// behind
                filename = "" + filename;
                break;
            case 2:// left
                filename = "left_" + filename;
                break;
            case 3:// right
                filename = "right_" + filename;
                break;
        }
        // String path = "/sdcard/Movies/" + filename;
        String path = Environment.getExternalStorageDirectory() + "/Movies/" + filename;    //文件保存路径


        return path;


    }


    private String createName(long dateTaken) {
        Log.i(TAG, "createName");
        Date date = new Date(dateTaken);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");


        System.out.println("创建文件名:" + "  " + dateFormat);


        Log.d(TAG, dateFormat.format(date));


        return dateFormat.format(date);


    }


    private void releaseMediaRecorder0() {
        Log.v(TAG, "Releasing media recorder0.");
        if (mMediaRecorder0 != null) {
            mMediaRecorder0.reset();
            mMediaRecorder0.release();
            mMediaRecorder0 = null;
            // mCamera0.lock();
        }
        isRecord0 = false;
        mRecordImage0.setVisibility(View.GONE);
    }


    private void releaseMediaRecorder1() {


        Log.v(TAG, "Releasing media recorder1.");
        if (mMediaRecorder1 != null) {
            mMediaRecorder1.reset();
            mMediaRecorder1.release();
            mMediaRecorder1 = null;
            // mCamera1.lock();
        }
        isRecord1 = false;
        mRecordImage1.setVisibility(View.GONE);
    }


    private void releaseMediaRecorder2() {
        Log.v(TAG, "Releasing media recorder2.");
        if (mMediaRecorder2 != null) {
            mMediaRecorder2.reset();
            mMediaRecorder2.release();
            mMediaRecorder2 = null;
            // mCamera2.lock();
        }
        isRecord2 = false;
        mRecordImage2.setVisibility(View.GONE);
    }


    private void releaseMediaRecorder3() {
        Log.v(TAG, "Releasing media recorder3.");
        if (mMediaRecorder3 != null) {
            mMediaRecorder3.reset();
            mMediaRecorder3.release();
            mMediaRecorder3 = null;
            // mCamera3.lock();
        }
        isRecord3 = false;
        mRecordImage3.setVisibility(View.GONE);


    }
    
    /**
     * @author Administrator 
     *  1路
     *  开启视频录制线程 时长 1min
     */ 
    Runnable runnable0 = new Runnable() {


                           @Override
                           public void run() {


                               System.out.println("释放1号资源:" + recLen0);
                               try {
                                   handler.postDelayed(this, 1000); // 一秒
                                   if (recLen0 == 0) {


                                       releaseMediaRecorder0();


                                   }
                                   recLen0--;
                                   if (recLen0 == -1) {
                                       handler.removeCallbacks(runnable0); // 关闭定时器


                                       System.out.println("1号开始录像:" + recLen0);
                                       // 录像
                                       new MediaPrepareTask0().execute(null, null, null);


                                       handler.postDelayed(runnable0, 1000); // 
                                       // Thread.sleep(1 * 60 * 1000);
                                       Thread.sleep(1 * 30 * 1000);
                                       recLen0 = 0;
                                   }


                               } catch (Exception e) {
                                   e.printStackTrace();
                               }
                           }
                       };
     
/**
* @author Administrator 
*  2路
*  开启视频录制线程 时长 1min
*/ 
    Runnable runnable1 = new Runnable() {


                           @Override
                           public void run() {


                               System.out.println("释放2号资源:" + recLen0);
                               try {
                                   handler.postDelayed(this, 1000); // 一秒
                                   if (recLen0 == 0) {
                                       releaseMediaRecorder1();


                                   }
                                   recLen0--;
                                   if (recLen0 == -1) {
                                       handler.removeCallbacks(runnable1); // 关闭定时器


                                       System.out.println("开始2号录像:" + recLen0);
                                       // 录像
                                       new MediaPrepareTask1().execute(null, null, null);


                                       handler.postDelayed(runnable1, 1000); // 


                                       Thread.sleep(1 * 30 * 1000);
                                       // Thread.sleep(1 * 60 * 1000);
                                       recLen0 = 0;


                                   }


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


    /**
     * @author Administrator 检测SD卡的存在
     */
    public void scannerSD() {
        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            Toast.makeText(getApplicationContext(), "SD卡异常", Toast.LENGTH_SHORT).show();
            // 录制退出
            MainActivity.this.finish();
        }
    }


    /**
     * 获得sd卡剩余容量,即可用大小
     * 
     * @return 剩余空间,单位:字节B
     */
    public static long getSDAvailableSize(String SDCardPath) {
        // SDCardPath = Environment.getExternalStorageState();
        SDCardPath = "/mnt/sdcard/";


        StatFs stat = new StatFs(SDCardPath);
        long blockSize = stat.getBlockSize();
        long availableBlocks = stat.getAvailableBlocks();


        System.out.println("SD卡剩余可用容量" + "=    " + blockSize * availableBlocks);


        return blockSize * availableBlocks;
    }


    /**
     * 获得SD卡总大小
     * 
     * @return 总大小,单位:字节B
     */


    public static long getSDTotalSize(String SDCardPath) {
        // TODO Auto-generated method stub


        SDCardPath = "/mnt/sdcard/";


        StatFs stat = new StatFs(SDCardPath);
        long blockSize = stat.getBlockSize();
        long totalBlocks = stat.getBlockCount();


        System.out.println("SD卡总容量" + "=  " + blockSize * totalBlocks);


        return blockSize * totalBlocks;


    }


    /*
     * 获取文件下的视频总时长
     */
    public void getVideoTime(String filePath) {
        ArrayList<File> list = new ArrayList<File>();
//      遍历文件  
        getFiles(list, filePath);
        long[] sorts = new long[list.size()];  
        long mCountTime = 0;
        for (int i = 0; i < list.size(); i++) {
            sorts[i] = Long.parseLong(list.get(i).getName().substring(0, 13));    //截取文件名


            String name = list.get(i).getName();


            System.out.println("获取的文件名 ====" + name);
            try {
                MediaPlayer meidaPlayer = new MediaPlayer();


                // meidaPlayer.setDataSource(filePath + list.get(i).getName());
                meidaPlayer.setDataSource(filePath + name);


                meidaPlayer.prepare();


                long time = meidaPlayer.getDuration();// 获得了视频的时长(以毫秒为单位)


                mCountTime += time;


                System.out.println("时长 === " + time);


                meidaPlayer.release();


            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
//      文件排序
        Arrays.sort(sorts);
        System.out.println("总时长 === " + mCountTime);
        // 测试如果 mCountTime > 5分钟 就删除第一个文件(最先录制的文件)
        if (mCountTime > 5 * 60 * 1000) {
            File deletefile = new File(filePath + sorts[0] + ".mp4");
            Log.e("删除的文件名是", "deletefile = " + filePath + sorts[0] + ".mp4");


            deletefile.delete();
        }


    }


    // 获取文件
    private void getFiles(ArrayList<File> list, String filePath) {
        File[] allFiles = new File(filePath).listFiles();
        for (int i = 0; i < allFiles.length; i++) {
            File file = allFiles[i];
            if (file.isFile()) {
                list.add(file);
            }
        }
    }

}

效果预览:

猜你喜欢

转载自blog.csdn.net/qq_38629981/article/details/80241699