Android 视频录制工具类
来源:互联网 发布:linux修改 ip命令 编辑:程序博客网 时间:2024/05/23 11:27
import android.content.Context;import android.hardware.Camera;import android.media.MediaRecorder;import android.os.Environment;import android.os.StatFs;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.widget.Toast;import java.io.File;import java.io.IOException;import java.text.DecimalFormat;/** * CreateTime 2017/10/16 15:00 * Author LiuShiHua * Description:录制视频 * <p> * 1.在Activity的oncreate方法中初始化 * 2.在onstart中调用RecordVideoUtil的startPreview方法生成预览界面 * 3.在onstop中调用RecordVideoUtil的stopRecord和stotPreview方法终止录制、预览界面 * <p> * duration 默认录制时间 */public class RecordVideoUtil { /** * 默认录制时间是30秒 */ private int duration = 30; private SurfaceHolder mSurfaceHolder; private Context context; private boolean mIsSufaceCreated = false; private Camera mCamera; private final static int CAMERA_ID = 0; private boolean isRecording = false; private final String TAG = "------------>录像"; private MediaRecorder mRecorder; public RecordVideoUtil(Context context, SurfaceView mCameraPreview) { this.context = context; mSurfaceHolder = mCameraPreview.getHolder(); mSurfaceHolder.addCallback(mSurfaceCallback); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } private SurfaceHolder.Callback mSurfaceCallback = new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { mIsSufaceCreated = false; } @Override public void surfaceCreated(SurfaceHolder holder) { mIsSufaceCreated = true; } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { startPreview(); } }; //启动预览 public void startPreview() { //保证只有一个Camera对象 if (mCamera != null || !mIsSufaceCreated) { Log.d(TAG, "startPreview will return"); return; } mCamera = Camera.open(CAMERA_ID); Camera.Parameters parameters = mCamera.getParameters();// Camera.Size size = getBestPreviewSize(, CameraUtils.PREVIEW_HEIGHT, parameters);// if (size != null) {// parameters.setPreviewSize(size.width, size.height);// } parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); parameters.setPreviewFrameRate(20); //设置相机预览方向 mCamera.setDisplayOrientation(90); mCamera.setParameters(parameters); try { mCamera.setPreviewDisplay(mSurfaceHolder); } catch (Exception e) { Log.d(TAG, e.getMessage()); } mCamera.startPreview(); } /** * 外部调用 * * @param savePath 存储路径 * @return 开始是否成功 */ public boolean startRecord(String savePath) { if (isRecording) { return false; } if (!hasSdcard()) { Toast.makeText(context, "请先插入SD卡(存储卡)", Toast.LENGTH_SHORT).show(); return false; } if (!isSDCanUseSize50M()) { Toast.makeText(context, "内存已经不足50M了,请先清理手机空间", Toast.LENGTH_SHORT).show(); } File file = new File(savePath); if (!file.exists()) { file.getParentFile().mkdirs(); try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(context, "文件创建失败", Toast.LENGTH_SHORT).show(); return false; } } if (mRecorder != null) { mRecorder.stop(); mRecorder.release(); mRecorder = null; } mRecorder = new MediaRecorder();//实例化 setMeadiaRecorder(mRecorder, file.getPath()); mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());//预览 mCamera.unlock(); try { mRecorder.prepare(); mRecorder.start(); isRecording = true; } catch (Exception e) { e.printStackTrace(); if (mCamera != null) { mCamera.lock(); } isRecording = false; mRecorder.release(); return false; } return true; } /** * 停止录制 * * @return */ public boolean stopRecord() { if (!isRecording || mRecorder == null) { return false; } mRecorder.stop(); mRecorder.release(); mRecorder = null; if (mCamera != null) { mCamera.lock(); } isRecording = false; //重启预览 startPreview(); return true; } /** * 在activity中的onPause中调用 * <p> * 释放Camera对象 */ public void stopPreview() { if (mCamera != null) { try { mCamera.setPreviewDisplay(null); } catch (Exception e) { Log.d(TAG, e.getMessage()); } mCamera.stopPreview(); mCamera.release(); mCamera = null; } } /** * 设置参数 * * @param mRecorder * @param filePath 1,花屏主要跟VideoSize有关,将Size调到640*480以上花屏问题可解决,或者录制屏幕为正方形。 * 2,清晰度和录制文件大小主要和EncodingBitRate有关,参数越大越清晰,同时录制的文件也越大。 * 3,视频文件的流畅度主要跟VideoFrameRate有关,参数越大视频画面越流畅,但实际中跟你的摄像头质量有很大关系。 */ private void setMeadiaRecorder(MediaRecorder mRecorder, String filePath) { mRecorder.setCamera(mCamera); //给Recorder设置Camera对象,保证录像跟预览的方向保持一致 mRecorder.setOrientationHint(90); //改变保存后的视频文件播放时是否横屏(不加这句,视频文件播放的时候角度是反的) mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置从摄像头采集图像 mRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); // 设置从麦克风采集声音 mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 设置视频的输出格式 为MP4 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 设置音频的编码格式 mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); // 设置视频的编码格式 mRecorder.setVideoEncodingBitRate(300000);//视频码率[最低300000] //设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错 mRecorder.setVideoSize(640, 480); //设置录制的视频帧率,必须放在设置编码和格式的后面,否则报错 mRecorder.setVideoFrameRate(20); mRecorder.setMaxDuration(duration * 1000); //设置最大录像时间为10s mRecorder.setOutputFile(filePath);//设置输出路径 } /** * 检查设备是否存在SDCard的工具方法 */ public static boolean hasSdcard() { String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { // 有存储的SDCard return true; } else { return false; } } /** * 获得sd卡剩余容量是否有50M,即可用大小 * * @return */ public static boolean isSDCanUseSize50M() { if (!hasSdcard()) { return false; } File path = Environment.getExternalStorageDirectory(); StatFs sf = new StatFs(path.getPath()); long size = sf.getBlockSize();//SD卡的单位大小 long available = sf.getAvailableBlocks();//可使用的数量 DecimalFormat df = new DecimalFormat(); df.setGroupingSize(3);//每3位分为一组 if (size * available / 1024 / 1024 < 50) { return false; } return true; }// 需要将以下方法放在调用此工具类的Activity/fragment中——解决暂停后无法录制的问题// @Override// protected void onStart() {// super.onStart();// if (videoUtil == null) return;// videoUtil.startPreview();// }//// @Override// protected void onPause() {// super.onPause();// if (videoUtil == null) return;// if (isRecordVideo) {// videoUtil.stopRecord();// }// videoUtil.stopPreview();// isRecordVideo = false;// }}
阅读全文
0 0
- Android 视频录制工具类
- 视频录制工具
- Android ADB工具-截图和录制视频(五)
- android视频录制(调用系统视频录制)
- Android基础--MediaRecorder类实现视频录制
- Android使用MediaRecorder类进行录制视频
- Android 视频录制
- android视频录制
- android 音视频录制
- android视频录制例子
- Android录制视频(五)
- Android录制视频(四)
- Android录制视频(三)
- Android录制视频(二)
- Android录制视频(一)
- Android视频录制
- VLC Android录制视频
- android-音视频录制
- github使用入门教程
- 光线传媒副总裁刘同:我们为什么要读大学?
- Git命令
- 在普通项目中配置Log4J
- .NET 远程调试 MVC/Web Api 项目
- Android 视频录制工具类
- css清除浮动
- 使用 VSCode 编辑器来编译 Sass
- Floyd-Warshall
- 网络安全(监测)知识入门
- 自定义属性实现个性化的Switch开关
- Java中null与""的对比
- 批处理命令
- mysql数据库表设计(1)