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;//    }}
原创粉丝点击