1. Process: com.example.mycamera2, PID: 24086
  2. java.lang.RuntimeException: start failed.
  3. at android.media.MediaRecorder.native_start(Native Method)
  4. at android.media.MediaRecorder.start(MediaRecorder.java:1157)
  5. at com.example.mycamera2.CameraUtils.startRecord(CameraUtils.java:161)
  6. at com.example.mycamera2.MainActivity$1.onClick(MainActivity.java:88)
  7. at android.view.View.performClick(View.java:5264)
  8. at android.view.View$PerformClick.run(View.java:21297)
  9. at android.os.Handler.handleCallback(Handler.java:743)
  10. at android.os.Handler.dispatchMessage(Handler.java:95)
  11. at android.os.Looper.loop(Looper.java:150)
  12. at android.app.ActivityThread.main(ActivityThread.java:5621)
  13. at java.lang.reflect.Method.invoke(Native Method)
  14. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
  15.      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)

 code:

  1. package com.example.mycamera2;
  2.  
  3. import android.content.Context;
  4. import android.hardware.Camera;
  5. import android.media.CamcorderProfile;
  6. import android.media.MediaCodec;
  7. import android.media.MediaRecorder;
  8. import android.os.Environment;
  9. import android.os.StatFs;
  10. import android.util.Log;
  11. import android.view.SurfaceHolder;
  12. import android.view.SurfaceView;
  13.  
  14. import java.io.File;
  15. import java.io.IOException;
  16. import java.util.List;
  17.  
  18. import static android.content.ContentValues.TAG;
  19.  
  20. /**
  21. * Created by guoxw on 2017/10/31.
  22. */
  23.  
  24. public class CameraUtils {
  25.  
  26. private MediaRecorder mediaRecorder;
  27. private Camera camera;
  28. private boolean isCheck;
  29. private SurfaceHolder.Callback callback;
  30. private Context context;
  31. private SurfaceView surfaceView;
  32. private int height=240,width=300;
  33.  
  34. private MediaCodec mediaCodec;
  35.  
  36. public void create(SurfaceView surfaceView, Context context) {
  37. this.context = context;
  38. this.surfaceView = surfaceView;
  39. surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  40. surfaceView.setKeepScreenOn(true);
  41. callback = new SurfaceHolder.Callback() {
  42. public void surfaceCreated(SurfaceHolder holder) {
  43. camera = Camera.open();
  44. getVideoSize();
  45. //setVideoFrameRate();
  46. mediaRecorder = new MediaRecorder();
  47. }
  48. public void surfaceChanged(SurfaceHolder holder, int format,
  49. int width, int height) {
  50. doChange(holder);
  51. // setVideoFrameRate();
  52. }
  53. @Override
  54. public void surfaceDestroyed(SurfaceHolder holder) {
  55. if(camera!=null){
  56. camera.release();
  57. camera=null;
  58. }
  59. }
  60. };
  61. surfaceView.getHolder().addCallback(callback);
  62.  
  63. }
  64.  
  65. private void doChange(SurfaceHolder holder) {
  66. try {
  67. camera.setPreviewDisplay(holder);
  68. camera.setDisplayOrientation(0);
  69. camera.startPreview();
  70. } catch (IOException e) {
  71. e.printStackTrace();
  72. }
  73. }
  74.  
  75. /**
  76. * startRecord 前调用一次,保证为前置摄像头
  77. */
  78. public void changeCamera() {
  79. int cameraCount = 0;
  80. Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
  81. cameraCount = Camera.getNumberOfCameras();
  82. for (int i = 0; i < cameraCount; i++) {
  83. Camera.getCameraInfo(i, cameraInfo);
  84. if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
  85. camera.stopPreview();
  86. camera.release();
  87. camera = null;
  88. camera = Camera.open(i);
  89. try {
  90. camera.setPreviewDisplay(surfaceView.getHolder());
  91. camera.setDisplayOrientation(0);
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. camera.startPreview();
  96. isCheck = true;
  97. break;
  98. }
  99. }
  100.  
  101. }
  102.  
  103. public void stopRecord() {
  104. mediaRecorder.release();
  105. /****/
  106. camera.stopPreview();
  107. camera.release();
  108. mediaRecorder = null;
  109. camera = Camera.open();
  110. mediaRecorder = new MediaRecorder();
  111. doChange(surfaceView.getHolder());
  112. }
  113.  
  114. public void destroy(){
  115. if(mediaRecorder!=null&&camera!=null){
  116. mediaRecorder.release();
  117. camera.release();
  118. mediaRecorder = null;
  119. camera=null;
  120. }
  121.  
  122. }
  123.  
  124. /**
  125. *
  126. * @param path 保存的路径
  127. * @param name 录像视频名称(不包含后缀)
  128. */
  129. public void startRecord(String path, String name) {
  130. camera.unlock();
  131. mediaRecorder.setCamera(camera);
  132. mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
  133. mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  134. //--mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
  135. mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
  136. //--好像不起作用
  137. //mediaRecorder.setVideoFrameRate(14);
  138. mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
  139. mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
  140. mediaRecorder.setVideoEncodingBitRate(500*1024);
  141. mediaRecorder.setVideoSize(width, height);
  142. // setVideoFrameRate();
  143. // mediaRecorder.setVideoFrameRate(14);
  144. //--getVideoSize();
  145. File file = new File(path);
  146. if (!file.exists()) {
  147. file.mkdirs();
  148. }
  149. mediaRecorder.setOutputFile(path + File.separator + name + ".mp4");
  150. File file1=new File(path + File.separator + name + ".mp4");
  151. if(file1.exists()){
  152. file1.delete();
  153. }
  154. mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
  155. /***不设置时,录制的视频总是倒着,翻屏导致视频上下翻滚*/
  156. mediaRecorder.setOrientationHint(0);
  157. try {
  158. mediaRecorder.prepare();
  159. mediaRecorder.start();
  160. } catch (IOException e) {
  161. e.printStackTrace();
  162. Log.d(TAG, "startRecord: --"+e.getMessage());
  163. }
  164. }
  165.  
  166. /***
  167. * 获取SupportedVideoSizes 控制输出视频width在300到600之间,选择最小的
  168. */
  169. public void getVideoSize(){
  170. Camera.Parameters parameters=camera.getParameters();
  171. List<Camera.Size> videoSize=parameters.getSupportedVideoSizes();
  172. if(videoSize!=null){
  173. for(int i=0;i<videoSize.size();i++){
  174. int width1=videoSize.get(i).width;
  175. int height1=videoSize.get(i).height;
  176. if(width1>=300&&width1<=500){
  177. if(height1>=200&&height1<=500){
  178. width=width1;
  179. height=height1;
  180. break;
  181. }
  182.  
  183. }
  184. Log.d(TAG, "getVideoSize:----w:-- "+videoSize.get(i).width+"---h:--"+videoSize.get(i).height);
  185. }
  186. }
  187.  
  188. }
  189.  
  190. /**
  191. * 没用
  192. */
  193. public void setVideoFrameRate(){
  194. CamcorderProfile cProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_TIME_LAPSE_LOW);
  195. mediaRecorder.setProfile(cProfile);
  196. //设置录制的视频帧率,注意文档的说明:
  197. mediaRecorder.setVideoFrameRate(20);
  198. }
  199.  
  200. /**
  201. * 获取手机内存可用大小 (返回kb值)
  202. */
  203. public long getAvailableBlicks(){
  204. File path = Environment.getDataDirectory();
  205. StatFs stat = new StatFs(path.getPath());
  206. long blockSize = stat.getBlockSize();
  207. long Blocks = stat.getAvailableBlocks();
  208. long size=blockSize*Blocks/1024;
  209. return size;
  210. }
  211. }

  

  1. btn.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View view) {
  4. if(x==0){
  5. cameraUtils.changeCamera();
  6. cameraUtils.startRecord(path,name);
  7. image.setVisibility(View.INVISIBLE);
  8. btn.setImageResource(R.drawable.camera_begain);
  9. x=1;
  10. } else if(x==1){
  11. cameraUtils.stopRecord();
  12. image.setVisibility(View.VISIBLE);
  13. btn.setImageResource(R.drawable.camera_stop);
  14. x=0;
  15. }
  16.  
  17. }
  18. });

 结论:

  方法: public void getVideoSize()获取手机支持的分辨率时,获得到的 List<Camera.Size> videoSize这个
   结果集为null,导致seartRecord方法中的 mediaRecorder.setVideoSize(width, height)设置的宽高不支持。
  至于getVideoSize返回为null的原因,待查。

  1. public List<Size> getSupportedVideoSizes() {
  2. String str = get(KEY_VIDEO_SIZE + SUPPORTED_VALUES_SUFFIX);
  3. return splitSize(str);
  4. }
  5.  
  6. private ArrayList<Size> splitSize(String str) {
  7. if (str == null) return null;
  8.  
  9. TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(',');
  10. splitter.setString(str);
  11. ArrayList<Size> sizeList = new ArrayList<Size>();
  12. for (String s : splitter) {
  13. Size size = strToSize(s);
  14. if (size != null) sizeList.add(size);
  15. }
  16. if (sizeList.size() == 0) return null;
  17. return sizeList;
  18. }

  

错误:Camera录制视频(6.0错误),5.1正常,7.1正常 (java.lang.RuntimeException: start failed.at android.media.MediaRecorder.native_start(Native Method))的更多相关文章

  1. Android 视频录制 java.lang.RuntimeException: start failed.

    //mRecorder.setVideoSize(320, 280); // mRecorder.setVideoFrameRate(5); mRecorder.setOutputFile(viodF ...

  2. Camera 录制视频的实现

    使用 Camera 录制视频, 实现步骤如下: 需要权限: android.permission.CAMERA android.permission.RECORD_AUDIO android.perm ...

  3. RCP开发中错误:java.lang.RuntimeException: WARNING: Prevented recursive attempt to activate part...

    在做RCP的eclipse插件开发时,启动管理软件界面时,总是报如下错误 : !ENTRY org.eclipse.ui.workbench 4 0 2012-05-25 18:44:21.306 ! ...

  4. sqoop导出hive数据到mysql错误: Caused by: java.lang.RuntimeException: Can't parse input data

    Sqoop Export数据到本地数据库时出现错误,命令如下: sqoop export \ --connect 'jdbc:mysql://202.193.60.117/dataweb?useUni ...

  5. 用idea+maven编译打包spark project core错误:java.lang.RuntimeException: Unable to load a Suite class

    Discovery starting. *** RUN ABORTED *** java.lang.RuntimeException: Unable to load a Suite class tha ...

  6. hadoop错误Ignoring exception during close for org.apache.hadoop.mapred.MapTask$NewOutputCollector@17bda0f2 java.io.IOException Spill failed

    1.错误    Ignoring exception during close for org.apache.hadoop.mapred.MapTask$NewOutputCollector@17bd ...

  7. kylin加载hive表错误:ERROR [http-bio-7070-exec-10] controller.TableController:189 : org/apache/hadoop/hive/conf/HiveConf java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf 解决办法

    一.问题背景 在kylin中加载hive表时,弹出提示框,内容是“oops!org/apache/hadoop/hive/conf/HiveConf”,无法加载hive表,查找kylin的日志时发现, ...

  8. MapReduce错误之Error: java.lang.RuntimeException: java.lang.NoSuchMethodException的解决方法

    今天跑MapReduce项目的时候遇到了这个问题,日志如下所示: // :: DEBUG ipc.ProtobufRpcEngine: Call: getDiagnostics took 19ms E ...

  9. java.lang.RuntimeException: java.lang.NullPointerException...的错误

    先FQ,让电脑能登上谷歌,然后重新安装,应该就好了,我的是这样解决的.如果下次安装又报:java.lang.RuntimeException: java.lang.NullPointerExcepti ...

随机推荐

  1. 使用JAVA写一个简单的日历

    JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...

  2. 怎么获取自定义核算项目里某一个类型的数据:做f7

    在BOS里加一个F7字段,关联物料或其他可以选到的基础资料.保存后先别发布    切换到BOS透视图,打到对应的.relation文件,修改supplierEntity,原来是指定物料的实体,改成自定 ...

  3. 【剑指Offer】2、替换空格

      题目描述:   请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. ...

  4. html第八节课

    导航 1.首先在<head>里面引用一个JQUERY的文件以用来制作鼠标点击动画效果(从网站上下载即可) 1 <script language="javascript&qu ...

  5. 自动装箱拆箱(Autoboxing,Unboxing)

    自动装箱和拆箱 https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html 1.5才有(Autoboxing,Unboxing) ...

  6. 算法工程师首先是工程师系列01 - 服务器篇 - 物理服务器安装centos7

    尤其在互联网公司中,如果不是分工特别明确的独立业务组,通常需要自己处理很多东西,例如一个算法工程师,虽然不要求你装机,但是和负责部署服务的同事对接口,总不能连json是啥都不知道(工作中遇到过一个ET ...

  7. Golang - 流程控制

    目录 Golang - 流程控制 1. 选择结构 2. 循环结构 3. 跳转语句 Golang - 流程控制 1. 选择结构 if else语句: //package 声明开头表示代码所属包 pack ...

  8. 2.Git可视化操作

    1.在本地新建版本库 首先,我们打开Git GUI是这样的一个界面,选择第一项,新建版本库. 然后选择你需要进行版本管理的项目路径,我选择了一个LoginDemo的项目. 当你创建了版本库的时候,你可 ...

  9. codeforces 257B

    #include<stdio.h> #define mod 1000000007 int main() { __int64 n,m,i,j,k,x,y,z; while(scanf(&qu ...

  10. ubuntu-ln命令

    安装软件完成后,常常需要使用ln命令来将命令重新定义一下路径,就相当于windows中的加入系统环境变量的意思 ~ sudo ln -s /home/spike/Downloads/redis/src ...