错误: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 ...
随机推荐
- 【剑指Offer】52、正则表达式匹配
题目描述: 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹 ...
- 在vue项目中引用element-ui时 让el-input 获取焦点的方法
在制作项目的时候遇到一个需求,点击一个按钮弹出一个input输入框,并让输入框获得焦点,项目中引用了ElementUI 在网上查找了很多方法,但是在实际使用中发现了一个问题无论是使用$ref获取inp ...
- 20190218-学习python使用shelve遇到raise error, "db type could not be determined"
照书上敲代码,运行了提示raise error, "db type could not be determined",现场如下: ubuntu-vm:~/code/massageb ...
- ecshop 后台增加栏目
① 后台左侧导航添加菜单 Ecshop后台增加一个左侧列表菜单需要修改三个文件/admin/includes/inc_menu.php /admin/includes/inc_priv.php /la ...
- 【习题 4-2 Uva201】Squares
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 注意那个星号的数量... 然后V x y的话,是从(y,x)向(y+1,x)连线. H x y才是从(x,y)向(x,y+1)连线 ...
- FreeMarker基本使用
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 l FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 ...
- hdu 3714 三分
#include<stdio.h> #define mi 1e-9 #define N 11000 struct node{ double x,y,z; }a[N]; int n; dou ...
- FZU Problem 2082 过路费
Problem 2082 过路费 Accept: 875 Submit: 2839Time Limit: 1000 mSec Memory Limit : 32768 KB Problem ...
- ABCDE
ABCDE A-Artificial intelligence 人工智能 B-Block chain 区块链 C-Cloud 云 D-Big Data 大数据 E-Ecology 互联网生态是以互联网 ...
- 使用enca进行字符集转码
在linux进行开发与运维的时候,我们常常遇到字符编码的问题,系统字符设置.vimrc fileencoding设置.终端设置往往搞的晕头转向,当一个文件出现乱码的时候,我们通常不能识别它是什么编码的 ...