`
king_tt
  • 浏览: 2113585 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android调用系统摄像头--使用MediaRecorder--2--使用MediaRecorder进行录制

 
阅读更多

准备好了预览(preview)之后,就可以使用MediaRecorder进行视频录制了,付上录制部分的代码

  1. publicclassAndroidCameraActivityextendsActivity{
  2. privatestaticfinalStringTAG="TAG-AndroidCameraActivity";
  3. publicstaticfinalintMEDIA_TYPE_IMAGE=1;
  4. publicstaticfinalintMEDIA_TYPE_VIDEO=2;
  5. privateCameramCamera;
  6. privateCameraPreviewmPreview;
  7. privateButtoncaptureButton;
  8. privateMediaRecordermMediaRecorder;
  9. privatebooleanisRecording=false;
  10. @Override
  11. publicvoidonCreate(BundlesavedInstanceState){
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.main);
  14. //创建Camera实例
  15. mCamera=getCameraInstance();
  16. //创建Previewview并将其设为activity中的内容
  17. mPreview=newCameraPreview(this,mCamera);
  18. FrameLayoutpreview=(FrameLayout)findViewById(R.id.camera_preview);
  19. preview.addView(mPreview);
  20. //为Capture按钮加入listener,拍摄视频
  21. captureButton=(Button)findViewById(R.id.button_capture);
  22. captureButton.setOnClickListener(newView.OnClickListener(){
  23. @Override
  24. publicvoidonClick(Viewv){
  25. if(isRecording){
  26. //停止录像,释放camera
  27. mMediaRecorder.stop();
  28. releaseMediaRecorder();
  29. mCamera.lock();
  30. //通知用户录像已停止
  31. captureButton.setText("开始录像");
  32. isRecording=false;
  33. }else{
  34. //初始化视频camera
  35. if(prepareVideoRecorder()){
  36. mMediaRecorder.start();
  37. //通知用户录像已开始
  38. captureButton.setText("停止录像");
  39. isRecording=true;
  40. }else{
  41. //准备未能完成,释放camera
  42. releaseMediaRecorder();
  43. }
  44. }
  45. }
  46. });
  47. }
  48. @Override
  49. protectedvoidonPause(){
  50. super.onPause();
  51. //如果正在使用MediaRecorder,首先需要释放它。
  52. releaseMediaRecorder();
  53. //在暂停事件中立即释放摄像头
  54. releaseCamera();
  55. }
  56. privatevoidreleaseMediaRecorder(){
  57. if(mMediaRecorder!=null){
  58. //清除recorder配置
  59. mMediaRecorder.reset();
  60. //释放recorder对象
  61. mMediaRecorder.release();
  62. mMediaRecorder=null;
  63. //为后续使用锁定摄像头
  64. mCamera.lock();
  65. }
  66. }
  67. privatevoidreleaseCamera(){
  68. if(mCamera!=null){
  69. //为其它应用释放摄像头
  70. mCamera.release();
  71. mCamera=null;
  72. }
  73. }
  74. privatebooleanprepareVideoRecorder(){
  75. mMediaRecorder=newMediaRecorder();
  76. //第1步:解锁并将摄像头指向MediaRecorder
  77. mCamera.unlock();
  78. mMediaRecorder.setCamera(mCamera);
  79. //第2步:指定源
  80. mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
  81. mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  82. //第3步:指定CamcorderProfile(需要APILevel8以上版本)
  83. //mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
  84. //第3步:设置输出格式和编码格式(针对低于APILevel8版本)
  85. mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
  86. mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
  87. mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
  88. //第4步:指定输出文件
  89. mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());
  90. //第5步:指定预览输出
  91. mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
  92. //第6步:根据以上配置准备MediaRecorder
  93. try{
  94. mMediaRecorder.prepare();
  95. }catch(IllegalStateExceptione){
  96. Log.d(TAG,"IllegalStateExceptionpreparingMediaRecorder:"+e.getMessage());
  97. releaseMediaRecorder();
  98. returnfalse;
  99. }catch(IOExceptione){
  100. Log.d(TAG,"IOExceptionpreparingMediaRecorder:"+e.getMessage());
  101. releaseMediaRecorder();
  102. returnfalse;
  103. }
  104. returntrue;
  105. }
  106. privateCameragetCameraInstance(){
  107. Camerac=null;
  108. try{
  109. //获取Camera实例
  110. c=Camera.open();
  111. }catch(Exceptione){
  112. //摄像头不可用(正被占用或不存在)
  113. }
  114. //不可用则返回null
  115. returnc;
  116. }
  117. privateFilegetOutputMediaFile(inttype){
  118. //......生成媒体文件,如xxx.mp4......
  119. }
  120. privatebooleancheckCameraHardware(Contextcontext){
  121. if(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
  122. //摄像头存在
  123. returntrue;
  124. }else{
  125. //摄像头不存在
  126. returnfalse;
  127. }
  128. }
  129. }

根据Android官方文档,在使用MediaRecorder进行视频录制的时候一定要严格遵循上面的顺序,否则会报错

在API里到处是“if it is called before setOutputFormat() or after prepare() ”因此一定要严格的按照顺序来进行摄像头操作

分享到:
评论

相关推荐

    Android移动开发-使用摄像头和麦克风录制视频的实现

    使用MediaRecorder录制视频与录制音频的步骤基本相同。只是录制视频时不仅需要采集声音,还需要采集图像。为了让MediaRecorder录制时采集图像,应该在调用setAudioSource(int audio_source)方法时再调用...

    Android 6.0之后使用MediaRecorder+Camera实现录制视频Demo

    Android 6.0之后使用MediaRecorder+Camera实现录制视频的Demo,注释详细阐述了一些使用上的注意点。例如在调用start()方法之前需要解锁摄像头、初始化摄像头部分机型存在摄像头反转问题的处理。

    Android使用MediaRecorder类实现视频和音频录制功能

     由官方配图可知,MediaRecorder用于录制视频时需要调用一系列的API来设置和录制相关的配置,而且调用方法的顺序是固定的,必须按照这个顺序进行API调用才能正确利用手机摄像头实现录像功能。 调用MediaRecorder的...

    Android Studio Camera2的录像功能

    利用MediaRecorder+Camera2框架实现基本的录像功能,当APP启动时自动打开摄像头,点击按钮开始录像,点击按钮停止录像并将录制的视频文件保存在sdcard/my_video/中

    android开发之调用手机的摄像头使用MediaRecorder录像并播放

    // 创建mediarecorder对象 // 设置录制视频源为Camera(相机) mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4 mediarecorder....

    android竖屏录制视频

    android利用mediarecorder来录制视频,调用camera,同时调整摄像头的方向为竖屏,录制完成的视频也是竖屏显示的。

    疯狂Android讲义源码

     11.2 使用MediaRecorder录制  音频 439  11.3 控制摄像头拍照 442  11.3.1 通过Camera进行拍照 442  11.3.2 录制视频短片 446  11.4 本章小结 450  第12章 OpenGL与3D应用开发 451  12.1 3D图像与3D开发的 ...

    疯狂Android讲义(第2版)源代码 第10章~第13章

    11.2、使用MediaRecorder录制音频: 11.3、控制摄像头拍照:Camera; 第12章、OpenGL与3D应用开发 12.2、OpenGL ES基础: 12.3、绘制2D图形: 12.4、绘制3D图形: 第13章、Android的网络应用 13.1、基于TCP协议...

    疯狂Android讲义.part2

    11.2 使用MediaRecorder录制 音频 439 11.3 控制摄像头拍照 442 11.3.1 通过Camera进行拍照 442 11.3.2 录制视频短片 446 11.4 本章小结 450 第12章 OpenGL与3D应用开发 451 12.1 3D图像与3D开发的 基本知识 452 ...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    11.2、使用MediaRecorder录制音频: 11.3、控制摄像头拍照:Camera; 第12章、OpenGL与3D应用开发 12.2、OpenGL ES基础: 12.3、绘制2D图形: 12.4、绘制3D图形: 第13章、Android的网络应用 13.1、基于TCP协议...

    Android仿微信录制小视频

    首先通过Camera类调用系统相机 通过surfaceview绘制出来 通过MediaRecorder来录制视频 闪光灯 和 切换摄像头 需要重新配置Camera的参数 Camera预览界面画面拉升的原因是因为Surfaceview的大小与设定的比例不...

    Android实例代码

    11.2、使用MediaRecorder录制音频: 11.3、控制摄像头拍照:Camera; 第12章、OpenGL与3D应用开发 12.2、OpenGL ES基础: 12.3、绘制2D图形: 12.4、绘制3D图形: 第13章、Android的网络应用 13.1、基于TCP协议...

    疯狂Android讲义.part1

    11.2 使用MediaRecorder录制 音频 439 11.3 控制摄像头拍照 442 11.3.1 通过Camera进行拍照 442 11.3.2 录制视频短片 446 11.4 本章小结 450 第12章 OpenGL与3D应用开发 451 12.1 3D图像与3D开发的 基本知识 452 ...

    Android手机前后摄像.rar

    一个简单的Demo来演示效果。兼容Android 10的手机,录制视频保存到内存,里面是个项目,源码有注释(调用前置摄像还是后置摄像),使用系统API,MediaRecorder类。(粗略写了一下权限请求)

Global site tag (gtag.js) - Google Analytics