安卓使用surfaceview+Camera+MediaRecorder实现视频录制
2017-02-09 14:16
471 查看
录制视频代码:
public class RecordVideoActivity extends Activity implements SurfaceHolder.Callback { private SurfaceView mSurfaceview; private ImageView mBtnStartStop; private boolean mStartedFlg = false; private MediaRecorder mRecorder; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private String path = ""; private int recordTime = 0; private LinearLayout llTime; private TextView tvTime; private TimerTask recordTask; private ProgressBar pbRecord; private int progress = 0; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 1) { if (progress == 240) { if (mRecorder != null) { mRecorder.stop(); mRecorder.reset(); } if (recordTask != null) { recordTask.cancel(); } Intent intent = new Intent(); intent.putExtra("path", path); setResult(RESULT_OK, intent); finish(); } pbRecord.setProgress(progress); } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏 getWindow().setFormat(PixelFormat.TRANSLUCENT); setContentView(R.layout.video2); initView(); mBtnStartStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { starRecordVideo(); } }); } /** * 初始化控件以及录制视频的分辨率 */ private void initView() { mSurfaceview = (SurfaceView) findViewById(R.id.surfaceview); llTime = (LinearLayout) findViewById(R.id.ll_time); tvTime = (TextView) findViewById(R.id.tv_time); pbRecord = (ProgressBar) findViewById(R.id.progressBar); pbRecord.setMax(240);//设置录制最大时间为120s mSurfaceHolder = mSurfaceview.getHolder(); //设置屏幕分辨率 mSurfaceHolder.setFixedSize(640, 480); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mSurfaceHolder.addCallback(this); mBtnStartStop = (ImageView) findViewById(R.id.btnStartStop); SurfaceHolder holder = mSurfaceview.getHolder();// 取得holder holder.addCallback(this); // holder加入回调接口 // setType必须设置,要不出错. holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } private void starRecordVideo() { if (!mStartedFlg) { // Start if (mRecorder == null) { mRecorder = new MediaRecorder(); // Create MediaRecorder } try { /** * 解锁camera * 设置输出格式为mpeg_4(mp4),此格式音频编码格式必须为AAC否则网页无法播放 */ mCamera.unlock(); mRecorder.setCamera(mCamera); mRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); //音频编码格式对应应为AAC mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //视频编码格式对应应为H264 mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mRecorder.setVideoSize(640, 480); mRecorder.setVideoEncodingBitRate(600 * 1024); mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); /** * 设置输出地址 */ String sdPath = getSDPath(); if (sdPath != null) { File dir = new File(sdPath + "/VideoAndAudio"); if (!dir.exists()) { dir.mkdir(); } path = dir + "/" + getDate() + ".mp4"; mRecorder.setOutputFile(path); mRecorder.setOrientationHint(90); mRecorder.prepare(); mRecorder.start(); // Recording is now started llTime.setVisibility(View.VISIBLE); pbRecord.setVisibility(View.VISIBLE); starRecordTimer(); mStartedFlg = true; updateProgress(); mBtnStartStop.setImageResource(R.mipmap.pause); } } catch (Exception e) { /** * 当用户拒绝录音权限会执行这里 */ Toast.makeText(RecordVideoActivity.this, "没有录音权限", Toast.LENGTH_SHORT).show(); finish(); } } else { if (mStartedFlg) { try { mRecorder.stop(); if (recordTask != null) { recordTask.cancel(); } mRecorder.reset(); mStartedFlg = false; Toast.makeText(RecordVideoActivity.this, "录制完成" + "视频地址:" + path, Toast.LENGTH_SHORT).show(); finish(); } catch (Exception e) { Toast.makeText(RecordVideoActivity.this, "录制失败", Toast.LENGTH_SHORT).show(); } } mStartedFlg = false; // Set button status flag } } private void updateProgress() { /** * 进度条线程 */ new Thread(new Runnable() { @Override public void run() { while (progress < 240) { if (mStartedFlg) { progress++; Log.e("ssd", progress + ""); try { Thread.sleep(500); handler.sendEmptyMessage(1); } catch (InterruptedException e) { e.printStackTrace(); } } else { break; } } } }).start(); } /** * 开启计时 */ private void starRecordTimer() { recordTask = new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { recordTime++; int m = recordTime / 60; int s = recordTime % 60; String strm = m + ""; String strs = s + ""; if (m < 10) { strm = "0" + m; } if (s < 10) { strs = "0" + s; } tvTime.setText(strm + ":" + strs); } }); } }; Timer recordTimer = new Timer(true); recordTimer.schedule(recordTask, 0, 1000); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub // 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder mSurfaceHolder = holder; } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub // 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder mSurfaceHolder = holder; startPreView(holder); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub // surfaceDestroyed的时候同时对象设置为null mSurfaceview = null; mSurfaceHolder = null; if (mRecorder != null) { mRecorder.release(); // Now the object cannot be reused mRecorder = null; } } /** * 开启预览 * * @param holder */ private void startPreView(SurfaceHolder holder) { try { if (mCamera == null) { mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); } if (mRecorder == null) { mRecorder = new MediaRecorder(); } if (mRecorder != null) { mCamera.setDisplayOrientation(90); mCamera.setPreviewDisplay(holder); Camera.Parameters parameters = mCamera.getParameters(); /** * Camera自动对焦 */ List<String> focusModes = parameters.getSupportedFocusModes(); if (focusModes != null) { for (String mode : focusModes) { mode.contains("continuous-video"); parameters.setFocusMode("continuous-video"); } } mCamera.setParameters(parameters); mCamera.startPreview(); } } catch (Exception e) { /** * 用户拒绝录像权限 */ Toast.makeText(RecordVideoActivity.this, "用户拒绝了录像权限", Toast.LENGTH_SHORT).show(); finish(); } } /** * 获取系统时间 * * @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(TAG, "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; } @Override protected void onPause() { super.onPause(); llTime.setVisibility(View.GONE); recordTime = 0; tvTime.setText("00.00"); mStartedFlg = false; mBtnStartStop.setImageResource(R.mipmap.pause); if (recordTask != null) { recordTask.cancel(); } // 如果正在使用MediaRecorder,首先需要释放它。 releaseMediaRecorder(); // 在暂停事件中立即释放摄像头 releaseCamera(); } private void releaseMediaRecorder() { if (mRecorder != null) { // 清除recorder配置 mRecorder.reset(); // 释放recorder对象 mRecorder.release(); mRecorder = null; // 为后续使用锁定摄像头 mCamera.lock(); } } private void releaseCamera() { if (mCamera != null) { // 为其它应用释放摄像头 mCamera.release(); mCamera = null; } } }
相关文章推荐
- 基于camera+SurfaceView+MediaRecorder的录制微视频
- 使用MediaRecorder+SurfaceView实现录像
- Android视频播放框架Vitamio集成及使用MediaPlayer+SurfaceView、VideoView+MediaController实现播放网络视频
- 录制视频(Surfaceview+MediaRecorder)
- 使用SurfaceView+MediaPlayer+SeekBar实现视频播放
- Android使用SurfaceView实现播放视频
- 使用Camera与SurfaceView实现自定义拍照功能
- Android - SurfaceView + MediaPlayer实现分段视频无缝播放
- 3D图片采集与展示(SurfaceView 自适应 Camera, 录制视频, 抽取帧)
- MediaPlayer简单使用,绑定surfaceView实现播放视频的功能
- Android - SurfaceView + MediaPlayer实现分段视频无缝播放
- Android SurfaceView+MediaPlayer实现视频播放
- Android使用MediaRecorder和Camera实现视频录制及播放功能整理
- android中使用surfaceview+MediaPlayer播放视频
- Android SurfaceView + MediaPlayer实现分段视频无缝播放
- SurfaceView + MediaPlayer 实现视频播放功能
- 使用SurfaceView和MediaPlayer实现视频做为背景
- 09-15 Camera (摄像机),SoundPool(播放提示音等小音频),VideoView(播放视频),SurfaceView(播放视频),MediaRecorder(录制音频)
- android下面使用SurfaceView+ mediaPlayer播放视频
- Android使用SurfaceView实现视频播放