使用MediaRecorder进行视频录制
2016-07-20 13:40
369 查看
1.仅适用MediaRecorder进行录制,此种方式网上很多,就是不加camera实现。
2.使用MediaRecorder+camera进行录制,此种方式可能会出现问题,下面的代码经过在4.4以及5.1系统测试均没问题。
权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission
android:name="android.permission.RECORD_AUDIO">
</uses-permission>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</uses-permission>
2.使用MediaRecorder+camera进行录制,此种方式可能会出现问题,下面的代码经过在4.4以及5.1系统测试均没问题。
权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission
android:name="android.permission.RECORD_AUDIO">
</uses-permission>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</uses-permission>
private Camera mCamera; private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; private CameraInfo[] mCameraInfo; private Button startButton; private boolean mIsRecording = false; private MediaRecorder mediaRecorder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSurfaceView = (SurfaceView)findViewById(R.id.surfaceview); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(new Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { releaseCamera(); } @Override public void surfaceCreated(SurfaceHolder holder) { initpreview(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } }); startButton = (Button)findViewById(R.id.start); startButton.setOnClickListener(this); } protected void releaseCamera() { if(mCamera!=null){ mCamera.stopPreview(); mCamera.release(); mCamera = null; } } protected void initpreview() { mCamera = Camera.open(CameraInfo.CAMERA_FACING_BACK); try { mCamera.setPreviewDisplay(mSurfaceHolder); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } setCameraDisplayOrientation(this,CameraInfo.CAMERA_FACING_BACK,mCamera); mCamera.startPreview(); } public static void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) { android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay() .getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onClick(View view) { int id = view.getId(); switch (id) { case R.id.start: if(mIsRecording==false) { startmediaRecorder(); }else{ stopmediaRecorder(); } if(mIsRecording){ startButton.setText("stop"); }else{ startButton.setText("start"); } break; default: break; } } private void stopmediaRecorder() { if(mediaRecorder!=null){ if(mIsRecording){ mediaRecorder.stop(); //mCamera.lock(); mediaRecorder.reset(); mediaRecorder.release(); mediaRecorder=null; mIsRecording = false; try { mCamera.reconnect(); } catch (IOException e) { Toast.makeText(this, "reconect fail", 0).show(); e.printStackTrace(); } } } } private void startmediaRecorder() { mCamera.unlock(); mIsRecording = true; mediaRecorder = new MediaRecorder(); mediaRecorder.reset(); mediaRecorder.setCamera(mCamera); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); CamcorderProfile mCamcorderProfile = CamcorderProfile.get(CameraInfo.CAMERA_FACING_BACK, CamcorderProfile.QUALITY_480P); mediaRecorder.setProfile(mCamcorderProfile); mediaRecorder.setVideoFrameRate(20); String fileName = DateUtils.formatDate(new Date(), "yyyyMMddHHmmss"); File file = new File(Environment.getExternalStorageDirectory(), fileName + ".mp4"); mediaRecorder.setOutputFile(file.getAbsolutePath()); mediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); try { mediaRecorder.prepare(); } catch (Exception e) { mIsRecording = false; Toast.makeText(this, "fail", 0).show(); e.printStackTrace(); mCamera.lock(); } mediaRecorder.start(); }
相关文章推荐
- [分享] 微信支付中商户对个人用户付款案例
- C# WinForm程序退出的方法
- rxjava(三)Subject与Scheduler
- 【手游】少年西游记 美术资源加密分析
- 解决安卓webview不支持input type=file问题
- iOS自定义的表情键盘
- c++ 提高4 map容器 共性机制 使用时机 比较| STL算法 算法基础仿函数 谓词 函数适配器 遍历算法
- JS模块化
- Xcode安装插件时,手误的解决办法
- CodeSmith批量生成实体
- 服务系能查看-通过gc和cpu定位代码问题
- 交叉编译mysql客户端libmysql
- Android开源:数据库ORM框架GreenDao学习(一)基础使用篇
- How to set up CA server on server 2012
- 详细理解 > /dev/null 2>&1
- java获取Weblogic JNDI数据源
- C++常用小技巧个人总结(持续更新)
- Unable to create 'E:/NFVdoc/.git/index.lock': File exists.解决方法
- mysql heartbeat 高可用
- 作为前端,你需要意识到什么?