版权声明:注明转载出处 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);
}
}
}
}
效果预览: