public class CameraView extends SurfaceView implements SurfaceHolder.Callback { private Camera camera; private Context context; private SurfaceHolder surfaceHolder; private boolean isRunning = false; private MediaRecorder mediaRecorder; //==================================== private boolean mStartedFlg = false; private String path = ""; public CameraView(Context context) { super(context); initData(context); } public CameraView(Context context, AttributeSet attrs) { super(context, attrs); initData(context); } public CameraView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initData(context); } private void initData(Context context) { this.context = context; surfaceHolder = getHolder(); surfaceHolder.addCallback(this); // surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { startPreView(surfaceHolder); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { if (mediaRecorder != null) { mediaRecorder.release(); mediaRecorder = null; } releaseCamera(); } public void starRecordVideo() { if (!mStartedFlg) { if (mediaRecorder == null) { mediaRecorder = new MediaRecorder(); } try { /** * 解锁camera * 设置输出格式为mpeg_4(mp4),此格式音频编码格式必须为AAC否则网页无法播放 */ camera.unlock(); mediaRecorder.setCamera(camera); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); //音频编码格式对应应为AAC mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //视频编码格式对应应为H264 mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediaRecorder.setVideoSize(640, 480); mediaRecorder.setVideoEncodingBitRate(600 * 1024); mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); /** * 设置输出地址 */ String sdPath = getSDPath(); if (sdPath != null) { File dir = new File(sdPath + "/VideoAndAudio"); if (!dir.exists()) { dir.mkdir(); } path = dir + "/" + getDate() + ".mp4"; mediaRecorder.setOutputFile(path); mediaRecorder.setOrientationHint(90); mediaRecorder.prepare(); mediaRecorder.start(); mStartedFlg = true; } } catch (Exception e) { e.printStackTrace(); } } else { if (mStartedFlg) { try { mediaRecorder.stop(); mediaRecorder.reset(); mStartedFlg = false; } catch (Exception e) { e.printStackTrace(); } } mStartedFlg = false; } } /** * 开启预览 * * @param holder */ private void startPreView(SurfaceHolder holder) { try { if (camera == null) { camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); } if (mediaRecorder == null) { mediaRecorder = new MediaRecorder(); } if (mediaRecorder != null) { camera.setDisplayOrientation(90); camera.setPreviewDisplay(holder); Camera.Parameters parameters = camera.getParameters(); /** * Camera自动对焦 */ List<String> focusModes = parameters.getSupportedFocusModes(); if (focusModes != null) { for (String mode : focusModes) { mode.contains("continuous-video"); parameters.setFocusMode("continuous-video"); } } camera.setParameters(parameters); camera.startPreview(); } } catch (Exception e) { e.printStackTrace(); } } public void onPause() { mStartedFlg = false; // 如果正在使用MediaRecorder,首先需要释放它。 releaseMediaRecorder(); // 在暂停事件中立即释放摄像头 releaseCamera(); } private void releaseMediaRecorder() { if (mediaRecorder != null) { // 清除recorder配置 mediaRecorder.reset(); // 释放recorder对象 mediaRecorder.release(); mediaRecorder = null; // 为后续使用锁定摄像头 camera.lock(); } } private void releaseCamera() { if (camera != null) { // 为其它应用释放摄像头 camera.release(); camera = null; } } /** * 获取系统时间 * * @return */ public static 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; Log.d("date", "date:" + date); return date; } /** * 获取SD path * * @return */ public String getSDPath() { File sdDir = null; boolean sdCardExist = Environment.getExternalStorageState() .equals(Environment.MEDIA_MOUNTED); // 判断sd卡是否存在 if (sdCardExist) { sdDir = Environment.getExternalStorageDirectory();// 获取跟目录 return sdDir.toString(); } return null; } }