MediaRecorder 切换摄像头 录制出错

qq_27226823 2016-09-25 08:49:04
public class MainActivity extends AppCompatActivity {

private MediaRecorder mediaRecorder;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private boolean isRecord = false;
private boolean isCaremaBack = true;
private Button startCameraBtn, changeCameraBtn;
private Camera camera;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initView();
}

private void initView() {
startCameraBtn = (Button) findViewById(R.id.startBtn);
changeCameraBtn = (Button) findViewById(R.id.changeBtn);
startCameraBtn.setOnClickListener(listener);
changeCameraBtn.setOnClickListener(listener);

surfaceView = (SurfaceView) findViewById(R.id.surfaview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(callback);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.startBtn:
if (!isRecord) {
if (mediaRecorder == null) {
mediaRecorder = new MediaRecorder();
}
if (camera == null) {
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
camera.unlock();
}
mediaRecorder.setCamera(camera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mediaRecorder.setVideoSize(480, 320);
mediaRecorder.setVideoFrameRate(camcorderProfile.videoFrameRate);//设置要捕获的视频帧速率
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());

String path = getSDPath();
if (path != null) {
File dir = new File(path + "/recordtest");
if (!dir.exists()) { //返回一个布尔值,指示是否可以在下面的文件系统中找到这个文件。
dir.mkdir();
}
path = dir + "/" + getDate() + ".mp4";
mediaRecorder.setOutputFile(path);
try {
mediaRecorder.prepare();//准备录音机开始捕获和编码数据。
} catch (IOException e) {
e.printStackTrace();
}
}
mediaRecorder.start();
isRecord = true;
startCameraBtn.setText("stop");
} else {
mediaRecorder.stop();
mediaRecorder.reset();
startCameraBtn.setText("start");
isRecord = false;
}
break;
case R.id.changeBtn:
camera.stopPreview();
camera.release();
camera = null;
if (isCaremaBack) {
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
isCaremaBack = false;
} else {
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
isCaremaBack=true;
}
try {
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();
isCaremaBack = false;
break;
}
}
};

SurfaceHolder.Callback callback = new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
surfaceHolder = holder;
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
surfaceHolder = holder;
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
surfaceView = null;
surfaceHolder = null;
if (mediaRecorder != null) {
mediaRecorder.release();
mediaRecorder = null;
}
}
};

public String getDate() {
Calendar ca = Calendar.getInstance();
int year = ca.get(Calendar.YEAR); // 获取年份
int month = ca.get(Calendar.MONTH); // 获取月份
int day = ca.get(Calendar.DATE); // 获取日
int minute = ca.get(Calendar.MINUTE); // 分
int hour = ca.get(Calendar.HOUR); // 小时
int second = ca.get(Calendar.SECOND); // 秒

String date = "" + year + (month + 1) + day + hour + minute + second;
return date;
}

public String getSDPath() {
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
if (sdCardExist) {
sdDir = Environment.getExternalStorageDirectory();// 获取跟目录
return sdDir.toString();
}

return null;
}

}


请问大神为什么我点击切换摄像头的按钮(然后切换了摄像头) 录屏就不会再录视频(卡在了切换的那一帧),而音频是正常的,如果不切换摄像头就是一切正常的,请问是哪里出问题了
...全文
298 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_27226823 2016-09-26
  • 打赏
  • 举报
回复
引用 1 楼 birdsaction 的回复:
录制的时候 不能切换摄像头,先要停止录制 然后关闭原来的摄像头, 然后重新打开新的摄像头 启动MediaRecord 都要重新设置。
谢谢你 我试试
Birds2018 2016-09-26
  • 打赏
  • 举报
回复
录制的时候 不能切换摄像头,先要停止录制 然后关闭原来的摄像头, 然后重新打开新的摄像头 启动MediaRecord 都要重新设置。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧