错误: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 ...
随机推荐
- eas之获取当前登陆信息
public void getSystemInfo() { // SysContext工具类可获取当前登陆用户的信息,可根据需要进行调用. // 举两例如下: ...
- 【Shell编程】Shell程序设计
1.Shell简介 作为Linux灵感来源的Unix系统最初是没有图形化界面的,所有的任务都是通过命令行来实现的.因此,Unix的命令行系统得到了很大的发展,逐步成为一个功能强大的系统. Sh ...
- Qt5.11+opencv3.4的配置安装
系统:Windows 10 64位 前期准备: 1.CMake下载安装 下载地址:https://cmake.org/download/ 选择msi安装文件,按照提示一步一步按照就好 可以参考:htt ...
- 【Codeforces 91B】Queue
[链接] 我是链接,点我呀:) [题意] [题解] 对于每个i,用二分的方法求出来y所在的位置j. 可以这样求. 假设现在二分到了位置mid. 那么随便用个rmq求出来mid..n这一段的最小值tem ...
- 在TOMCAT上手工生成及部署WAR包
以前是用ECLIPSE或是其它IDE自动生成,不明了. 这次手写JAVA,先生成CALSS来部署, 之后用WAR包来部署.(查了资料,好像直接用JAR来部署TOMCAT的WEB项目,不得行) 就上次生 ...
- DLR概念
参考文章 动态语言运行时(Dynamic Language Runtime,DLR)是一套基于.NET的类库,它的作用是简化在CLR上开发动态语言的工作,例如DLR中提供了表达式树的创建,代码生成.优 ...
- pl/sql developer 自带汉化选项
pl/sql developer 自带汉化选项 版本:11.0.2 工具 -> 选项 -> 用户界面 ->外观, 第一项就是选择语言: 选择Chinese.lang,如果有的话:
- android发送get请求时报错
异常信息: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.synology.synologycloud/ ...
- Android软键盘状态的切换及其强制隐藏
MainActivity例如以下: package cc.c; import android.os.Bundle; import android.view.View; import android.v ...
- luogu4012 深海机器人问题 网络流
关键词:最小费用最大流 题目大意:海底是个网格,每个网格边有一定价值的海底化石.每个路线可经过无限个机器人,但上面的化石只能采一次.机器人可沿网格边向东或向北移动.给定机器人起点和终点位置及所能容纳的 ...