MediaRecorder录像实现时间分段(每10秒stop一次,之后继续录像)

最近纠结好好久这个问题,网上对于这个问题没有准确的答复,几乎都是抄过来抄过去,几经波折,在和同事的讨论下,最终把这个问题解决

原理:1:设置录制的最大时间,

            2:对录制最大时间进行监控

            3:预订要录制的视屏数目,之后录制一段count++;handler发送定时消息sendEmptyDelayed(TYPE,2000);

                  录制结束,中途打断两秒后开始录制

            4:使用handler消息处理机制

                       如果消息的类型为  TYPE。则继续执行录制视屏程序

            好了,见代码吧,我这是有两个界面之间的转换,不过不影响录制的实现,直接删除就好;



package org.crazyit.sound;


import java.io.File;


import android.app.Activity;
import android.content.Intent;
import android.media.MediaRecorder;
import android.media.MediaRecorder.OnInfoListener;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;


public class RecordVideo extends Activity implements OnClickListener {
private Handler mHandler;
private final int TYPE = 0X1;
private int maxRec = 2;
private int currentRec = 1;


// 程序中的两个按钮
Button record, stop;
// 系统的视频文件
File videoFile;
private static MediaRecorder mRecorder;
// 显示视频预览的SurfaceView
SurfaceView sView;
// 记录是否正在进行录制
private boolean isRecording = false;


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
init();
}


private void init() {
mRecorder = new MediaRecorder();
mHandler = new MyHandler();
// 获取程序界面中的两个按钮
record = (Button) findViewById(R.id.record);
stop = (Button) findViewById(R.id.stop);
// 让stop按钮不可用。
stop.setEnabled(false);
// 为两个按钮的单击事件绑定监听器
record.setOnClickListener(this);
stop.setOnClickListener(this);
// 获取程序界面中的SurfaceView
sView = (SurfaceView) this.findViewById(R.id.sView);
// 设置Surface不需要自己维护缓冲区
sView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// 设置分辨率
sView.getHolder().setFixedSize(320, 280);
// 设置该组件让屏幕不会自动关闭
sView.getHolder().setKeepScreenOn(true);
 
}


private void initMediaRecorder() {
mRecorder = new MediaRecorder();
mRecorder.reset();
// 设置从麦克风采集声音
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置从摄像头采集图像
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// 设置视频文件的输出格式
// 必须在设置声音编码格式、图像编码格式之前设置
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
// 设置声音编码的格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
// 设置图像编码的格式
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);


// mRecorder.setVideoSize(320, 280);
// 每秒 4帧
// mRecorder.setVideoFrameRate(4);


mRecorder.setOutputFile(Environment.getExternalStorageDirectory()
+ File.separator + System.currentTimeMillis() + ".mp4");
// 指定使用SurfaceView来预览视频
mRecorder.setPreviewDisplay(sView.getHolder().getSurface());
// 设置最大录制时间
mRecorder.setMaxDuration(10000);


// 对录像时间进行监听


mRecorder.setOnInfoListener(new OnInfoListener() {
public void onInfo(MediaRecorder mr, int what, int extra) {
if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {
System.out.println("已经达到最长录制时间");
if (mRecorder != null) {
mRecorder.reset();
mRecorder.release();
if (currentRec < maxRec) {
currentRec++;
mHandler.sendEmptyMessageDelayed(TYPE, 2000);
} else if (currentRec == maxRec) {
Intent intent = new Intent(RecordVideo.this,
MuneActivity.class);
startActivity(intent);
}


}
}
}
});
}


public void onClick(View source) {
switch (source.getId()) {
// 单击录制按钮
case R.id.record:


if (!Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
Toast.makeText(RecordVideo.this, "SD卡不存在,请插入SD卡!",
Toast.LENGTH_SHORT).show();
return;
}

startRecorde();
  break;


// 单击停止按钮
case R.id.stop:
// 如果正在进行录制
if (isRecording) {
// 停止录制
mRecorder.stop();
// 释放资源
mRecorder.release();
mRecorder = null;
// 让record按钮可用。
record.setEnabled(true);
// 让stop按钮不可用。
stop.setEnabled(false);


Intent intent = new Intent(RecordVideo.this, MuneActivity.class);
startActivity(intent);


}
break;
}
}


private class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
if (msg.what == TYPE) {
startRecorde();
}
}
}


public void startRecorde() {


initMediaRecorder();
try {
Log.i("info", Environment.getExternalStorageDirectory()
+ File.separator + System.currentTimeMillis() + ".mp4");
mRecorder.prepare();
mRecorder.start();
System.out.println("---recording---");
record.setEnabled(false); // 让record按钮不可用。
stop.setEnabled(true); // 让stop按钮可用。
isRecording = true;
} catch (Exception e) {
e.printStackTrace();
}
}
}

整个代码的程序还是比较流畅的,新手写的,可以运行,欢迎大家前来讨论,不喜勿喷

你可能感兴趣的:(安卓前端)