MediaRecord 录制视频
10分钟的视频大概有60M, 权限自己处理(有问题的话,说一下,我这边可以提供援助)
// 工具类,直接复制就好
public class CameraUtils {
private MediaRecorder mediaRecorder;
private Camera camera;
/*** 标识当前是前摄像头还是后摄像头 back:0 front:1*/
private int backOrFtont = 0;
private SurfaceHolder.Callback callback;
private Context context;
private SurfaceView surfaceView;
/***录制视频的videoSize*/
private int height, width;
/***photo的height ,width*/
private int heightPhoto, widthPhoto;
public void create(SurfaceView surfaceView, Context context) {
this.context = context;
this.surfaceView = surfaceView;
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.setKeepScreenOn(true);
callback = new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
getVideoSize();
mediaRecorder = new MediaRecorder();
}
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
doChange(holder);
focus();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.release();
camera = null;
}
}
};
surfaceView.getHolder().addCallback(callback);
}
private void doChange(SurfaceHolder holder) {
try {
camera.setPreviewDisplay(holder);
camera.setDisplayOrientation(90);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 切换摄像头
*/
public void changeCamera() {
int cameraCount = 0;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras();
for (int i = 0; i < cameraCount; i++) {
Camera.getCameraInfo(i, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT && backOrFtont == 0) {
camera.stopPreview();
camera.release();
camera = null;
camera = Camera.open(i);
try {
camera.setPreviewDisplay(surfaceView.getHolder());
camera.setDisplayOrientation(90);
} catch (IOException e) {
e.printStackTrace();
}
backOrFtont = 1;
camera.startPreview();
break;
} else if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK && backOrFtont == 1) {
camera.stopPreview();
camera.release();
camera = null;
camera = Camera.open(i);
try {
camera.setPreviewDisplay(surfaceView.getHolder());
camera.setDisplayOrientation(90);
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();
backOrFtont = 0;
break;
}
}
}
public void stopRecord() {
mediaRecorder.release();
camera.release();
mediaRecorder = null;
camera = Camera.open();
mediaRecorder = new MediaRecorder();
doChange(surfaceView.getHolder());
}
public void stop() {
if (mediaRecorder != null && camera != null) {
mediaRecorder.release();
camera.release();
}
}
public void destroy() {
if (mediaRecorder != null && camera != null) {
mediaRecorder.release();
camera.release();
mediaRecorder = null;
camera = null;
}
}
/**
* @param path 保存的路径
* @param name 录像视频名称(不包含后缀)
*/
public void startRecord(String path, String name) {
camera.unlock();
mediaRecorder.setCamera(camera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setVideoEncodingBitRate(700 * 1024);
// mediaRecorder.setVideoSize(width, height);
// mediaRecorder.setVideoFrameRate(24);
mediaRecorder.setOutputFile(path);
mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
/***不设置时,录制的视频总是倒着,翻屏导致视频上下翻滚,前后摄像头设置不同*/
if(backOrFtont == 0){
mediaRecorder.setOrientationHint(90);
}else {
mediaRecorder.setOrientationHint(270);
}
try {
mediaRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
try {
mediaRecorder.start();
} catch (Exception e) {
e.printStackTrace();
}
}
/***
* 获取SupportedVideoSizes 控制输出视频width在300到600之间(尽可能小)
* 获取PictureSize的大小(控制在w:1000-2000之间)
*/
public void getVideoSize() {
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> videoSize = parameters.getSupportedVideoSizes();
for (int i = 0; i < videoSize.size(); i++) {
int width1 = videoSize.get(i).width;
int height1 = videoSize.get(i).height;
if (width1 >= 300 && width1 <= 600) {
if (height1 >= 200 && height1 <= 600) {
width = width1;
height = height1;
}
}
}
List<Camera.Size> photoSize = parameters.getSupportedPictureSizes();
for (int i = 0; i < photoSize.size(); i++) {
int width1 = photoSize.get(i).width;
int height1 = photoSize.get(i).height;
if (width1 >= 1000 && width1 <= 2000) {
if (height1 >= 600 && height1 <=2000) {
widthPhoto = width1;
heightPhoto = height1;
}
}
}
}
public void takePicture(String photoPath, String photoName) {
camera.takePicture(null, null, new PictureCallBack(photoPath, photoName));
}
/**
* 聚焦
*/
public void focus(){
Camera.Parameters parameters=camera.getParameters();
parameters.setPictureSize(widthPhoto,heightPhoto);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
camera.setParameters(parameters);
camera.cancelAutoFocus();
}
/*** 拍照功能*/
private class PictureCallBack implements Camera.PictureCallback {
/*** 照片保存的路径和名称*/
private String path;
private String name;
public PictureCallBack(String path, String name) {
this.path = path;
this.name = name;
}
@Override
public void onPictureTaken(byte[] bytes, Camera camera) {
File file1 = new File(path);
if (!file1.exists()) {
file1.mkdirs();
}
File file = new File(path, name);
if (file.exists()) {
file.delete();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
try {
fos.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
camera.startPreview();
}
}
}
Activity中:
在onCreat 中初始化:
CameraUtils cameraUtils = new CameraUtils();
cameraUtils.create(scannerView, this); // 第一个参数,布局中的SurfaceView
点击开始录制: 开始录制暂停录制状态可以自己定义布尔值来处理
createRecordDir(); // 先创建文件夹(下面有方法)用来储存录制的视频,也可以自定义
cameraUtils.startRecord(mVecordFile.getAbsolutePath(), name);// 第一个文件地址,第二个参数工具类没用到,可去掉也可以传个""
//创建文件夹
private void createRecordDir() {
// File sampleDir = new File(Environment.getExternalStorageDirectory() + File.separator + "im/video/");
File sampleDir = new File(Environment.getExternalStorageDirectory() + File.separator + "RecordVideo/");
//File sampleDir = new File("/video/");
if (!sampleDir.exists()) {
sampleDir.mkdirs();
}
File vecordDir = sampleDir;
// 创建文件
try {
mVecordFile = File.createTempFile("recording", ".mp4", vecordDir);//mp4格式
//LogUtils.i(mVecordFile.getAbsolutePath());
Log.d("Path:", mVecordFile.getAbsolutePath());
} catch (IOException e) {
}
}
结束录制:
cameraUtils.stopRecord();
切换摄像头: 有一点正在录制中时切换摄像头会停掉录制,录制中自己判断定义的布尔值来提示录制中不能切换摄像头
cameraUtils.changeCamera();
在就是最后这两
@Override
protected void onStop() {
super.onStop();
cameraUtils.stop();
}
@Override
protected void onDestroy() {
super.onDestroy();
cameraUtils.destroy();
}
有问题随时回答
版权声明:本文为weixin_41923368原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。