错误:Camera录制视频(6.0错误),5.1正常,7.1正常 (java.lang.RuntimeException: start failed.at android.media.MediaRecorder.native_start(Native Method))
- Process: com.example.mycamera2, PID: 24086
- java.lang.RuntimeException: start failed.
- at android.media.MediaRecorder.native_start(Native Method)
- at android.media.MediaRecorder.start(MediaRecorder.java:1157)
- at com.example.mycamera2.CameraUtils.startRecord(CameraUtils.java:161)
- at com.example.mycamera2.MainActivity$1.onClick(MainActivity.java:88)
- at android.view.View.performClick(View.java:5264)
- at android.view.View$PerformClick.run(View.java:21297)
- at android.os.Handler.handleCallback(Handler.java:743)
- at android.os.Handler.dispatchMessage(Handler.java:95)
- at android.os.Looper.loop(Looper.java:150)
- at android.app.ActivityThread.main(ActivityThread.java:5621)
- at java.lang.reflect.Method.invoke(Native Method)
- at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
- at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)
code:
- package com.example.mycamera2;
- import android.content.Context;
- import android.hardware.Camera;
- import android.media.CamcorderProfile;
- import android.media.MediaCodec;
- import android.media.MediaRecorder;
- import android.os.Environment;
- import android.os.StatFs;
- import android.util.Log;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- import java.io.File;
- import java.io.IOException;
- import java.util.List;
- import static android.content.ContentValues.TAG;
- /**
- * Created by guoxw on 2017/10/31.
- */
- public class CameraUtils {
- private MediaRecorder mediaRecorder;
- private Camera camera;
- private boolean isCheck;
- private SurfaceHolder.Callback callback;
- private Context context;
- private SurfaceView surfaceView;
- private int height=240,width=300;
- private MediaCodec mediaCodec;
- public void create(SurfaceView surfaceView, Context context) {
- this.context = context;
- this.surfaceView = surfaceView;
- surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- surfaceView.setKeepScreenOn(true);
- callback = new SurfaceHolder.Callback() {
- public void surfaceCreated(SurfaceHolder holder) {
- camera = Camera.open();
- getVideoSize();
- //setVideoFrameRate();
- mediaRecorder = new MediaRecorder();
- }
- public void surfaceChanged(SurfaceHolder holder, int format,
- int width, int height) {
- doChange(holder);
- // setVideoFrameRate();
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- if(camera!=null){
- camera.release();
- camera=null;
- }
- }
- };
- surfaceView.getHolder().addCallback(callback);
- }
- private void doChange(SurfaceHolder holder) {
- try {
- camera.setPreviewDisplay(holder);
- camera.setDisplayOrientation(0);
- camera.startPreview();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * startRecord 前调用一次,保证为前置摄像头
- */
- public void changeCamera() {
- int cameraCount = 0;
- Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
- cameraCount = Camera.getNumberOfCameras();
- for (int i = 0; i < cameraCount; i++) {
- Camera.getCameraInfo(i, cameraInfo);
- if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
- camera.stopPreview();
- camera.release();
- camera = null;
- camera = Camera.open(i);
- try {
- camera.setPreviewDisplay(surfaceView.getHolder());
- camera.setDisplayOrientation(0);
- } catch (IOException e) {
- e.printStackTrace();
- }
- camera.startPreview();
- isCheck = true;
- break;
- }
- }
- }
- public void stopRecord() {
- mediaRecorder.release();
- /****/
- camera.stopPreview();
- camera.release();
- mediaRecorder = null;
- camera = Camera.open();
- mediaRecorder = new MediaRecorder();
- doChange(surfaceView.getHolder());
- }
- public void destroy(){
- if(mediaRecorder!=null&&camera!=null){
- mediaRecorder.release();
- camera.release();
- mediaRecorder = null;
- camera=null;
- }
- }
- /**
- *
- * @param path 保存的路径
- * @param name 录像视频名称(不包含后缀)
- */
- public void startRecord(String path, String name) {
- camera.unlock();
- mediaRecorder.setCamera(camera);
- mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
- mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
- //--mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
- mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
- //--好像不起作用
- //mediaRecorder.setVideoFrameRate(14);
- mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
- mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
- mediaRecorder.setVideoEncodingBitRate(500*1024);
- mediaRecorder.setVideoSize(width, height);
- // setVideoFrameRate();
- // mediaRecorder.setVideoFrameRate(14);
- //--getVideoSize();
- File file = new File(path);
- if (!file.exists()) {
- file.mkdirs();
- }
- mediaRecorder.setOutputFile(path + File.separator + name + ".mp4");
- File file1=new File(path + File.separator + name + ".mp4");
- if(file1.exists()){
- file1.delete();
- }
- mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
- /***不设置时,录制的视频总是倒着,翻屏导致视频上下翻滚*/
- mediaRecorder.setOrientationHint(0);
- try {
- mediaRecorder.prepare();
- mediaRecorder.start();
- } catch (IOException e) {
- e.printStackTrace();
- Log.d(TAG, "startRecord: --"+e.getMessage());
- }
- }
- /***
- * 获取SupportedVideoSizes 控制输出视频width在300到600之间,选择最小的
- */
- public void getVideoSize(){
- Camera.Parameters parameters=camera.getParameters();
- List<Camera.Size> videoSize=parameters.getSupportedVideoSizes();
- if(videoSize!=null){
- for(int i=0;i<videoSize.size();i++){
- int width1=videoSize.get(i).width;
- int height1=videoSize.get(i).height;
- if(width1>=300&&width1<=500){
- if(height1>=200&&height1<=500){
- width=width1;
- height=height1;
- break;
- }
- }
- Log.d(TAG, "getVideoSize:----w:-- "+videoSize.get(i).width+"---h:--"+videoSize.get(i).height);
- }
- }
- }
- /**
- * 没用
- */
- public void setVideoFrameRate(){
- CamcorderProfile cProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_TIME_LAPSE_LOW);
- mediaRecorder.setProfile(cProfile);
- //设置录制的视频帧率,注意文档的说明:
- mediaRecorder.setVideoFrameRate(20);
- }
- /**
- * 获取手机内存可用大小 (返回kb值)
- */
- public long getAvailableBlicks(){
- File path = Environment.getDataDirectory();
- StatFs stat = new StatFs(path.getPath());
- long blockSize = stat.getBlockSize();
- long Blocks = stat.getAvailableBlocks();
- long size=blockSize*Blocks/1024;
- return size;
- }
- }
- btn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- if(x==0){
- cameraUtils.changeCamera();
- cameraUtils.startRecord(path,name);
- image.setVisibility(View.INVISIBLE);
- btn.setImageResource(R.drawable.camera_begain);
- x=1;
- } else if(x==1){
- cameraUtils.stopRecord();
- image.setVisibility(View.VISIBLE);
- btn.setImageResource(R.drawable.camera_stop);
- x=0;
- }
- }
- });
结论:
方法: public void getVideoSize()获取手机支持的分辨率时,获得到的 List<Camera.Size> videoSize这个
结果集为null,导致seartRecord方法中的 mediaRecorder.setVideoSize(width, height)设置的宽高不支持。
至于getVideoSize返回为null的原因,待查。
- public List<Size> getSupportedVideoSizes() {
- String str = get(KEY_VIDEO_SIZE + SUPPORTED_VALUES_SUFFIX);
- return splitSize(str);
- }
- private ArrayList<Size> splitSize(String str) {
- if (str == null) return null;
- TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(',');
- splitter.setString(str);
- ArrayList<Size> sizeList = new ArrayList<Size>();
- for (String s : splitter) {
- Size size = strToSize(s);
- if (size != null) sizeList.add(size);
- }
- if (sizeList.size() == 0) return null;
- return sizeList;
- }
错误:Camera录制视频(6.0错误),5.1正常,7.1正常 (java.lang.RuntimeException: start failed.at android.media.MediaRecorder.native_start(Native Method))的更多相关文章
- Android 视频录制 java.lang.RuntimeException: start failed.
//mRecorder.setVideoSize(320, 280); // mRecorder.setVideoFrameRate(5); mRecorder.setOutputFile(viodF ...
- Camera 录制视频的实现
使用 Camera 录制视频, 实现步骤如下: 需要权限: android.permission.CAMERA android.permission.RECORD_AUDIO android.perm ...
- 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 ! ...
- 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 ...
- 用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 ...
- 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 ...
- 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的日志时发现, ...
- MapReduce错误之Error: java.lang.RuntimeException: java.lang.NoSuchMethodException的解决方法
今天跑MapReduce项目的时候遇到了这个问题,日志如下所示: // :: DEBUG ipc.ProtobufRpcEngine: Call: getDiagnostics took 19ms E ...
- java.lang.RuntimeException: java.lang.NullPointerException...的错误
先FQ,让电脑能登上谷歌,然后重新安装,应该就好了,我的是这样解决的.如果下次安装又报:java.lang.RuntimeException: java.lang.NullPointerExcepti ...
随机推荐
- 使用JAVA写一个简单的日历
JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...
- 怎么获取自定义核算项目里某一个类型的数据:做f7
在BOS里加一个F7字段,关联物料或其他可以选到的基础资料.保存后先别发布 切换到BOS透视图,打到对应的.relation文件,修改supplierEntity,原来是指定物料的实体,改成自定 ...
- 【剑指Offer】2、替换空格
题目描述: 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. ...
- html第八节课
导航 1.首先在<head>里面引用一个JQUERY的文件以用来制作鼠标点击动画效果(从网站上下载即可) 1 <script language="javascript&qu ...
- 自动装箱拆箱(Autoboxing,Unboxing)
自动装箱和拆箱 https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html 1.5才有(Autoboxing,Unboxing) ...
- 算法工程师首先是工程师系列01 - 服务器篇 - 物理服务器安装centos7
尤其在互联网公司中,如果不是分工特别明确的独立业务组,通常需要自己处理很多东西,例如一个算法工程师,虽然不要求你装机,但是和负责部署服务的同事对接口,总不能连json是啥都不知道(工作中遇到过一个ET ...
- Golang - 流程控制
目录 Golang - 流程控制 1. 选择结构 2. 循环结构 3. 跳转语句 Golang - 流程控制 1. 选择结构 if else语句: //package 声明开头表示代码所属包 pack ...
- 2.Git可视化操作
1.在本地新建版本库 首先,我们打开Git GUI是这样的一个界面,选择第一项,新建版本库. 然后选择你需要进行版本管理的项目路径,我选择了一个LoginDemo的项目. 当你创建了版本库的时候,你可 ...
- codeforces 257B
#include<stdio.h> #define mod 1000000007 int main() { __int64 n,m,i,j,k,x,y,z; while(scanf(&qu ...
- ubuntu-ln命令
安装软件完成后,常常需要使用ln命令来将命令重新定义一下路径,就相当于windows中的加入系统环境变量的意思 ~ sudo ln -s /home/spike/Downloads/redis/src ...