MediaRecorder 在某些设备上启动失败(启动失败:-2147483648 和 -19)
Posted
技术标签:
【中文标题】MediaRecorder 在某些设备上启动失败(启动失败:-2147483648 和 -19)【英文标题】:MediaRecorder fails on start on some devices (start failed: -2147483648 and -19) 【发布时间】:2013-12-31 06:54:51 【问题描述】:我已经阅读了有关MediaRecorder and followed the GUIDES on android 的所有内容。
好吧,它至少可以在 API 8 或更高版本上正常工作,但我的最低 SDK 是 14,所以我应该会更好。
在我的设备上,三星 Galaxy S3 Mini 运行良好。其他一些带有冰淇淋三明治的设备,但有些没有。他们崩溃了:
mediaRecorder.start()
我创建了一个用于录制视频的服务,这是我的代码(我在每个阶段所做的指南):
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder)
//OPEN CAMERA
int ncamara=0;
qcamara=0;
if(android.os.Build.VERSION.SDK_INT<9)
camera = Camera.open();
else
try
ncamara = Camera.getNumberOfCameras();
if (f.leer("camara", context).equals("frontal"))
qcamara=10;
else qcamara=20;
catch (Exception e)
if (ncamara>=2 && qcamara == 10)
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
else if (ncamara>=2 && qcamara == 20)
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
else
camera = Camera.open();
//
try
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
catch (IOException e1)
e1.printStackTrace();
//UNLOCK CAMERA
camera.unlock();
mediaRecorder = new MediaRecorder();
mediaRecorder.setCamera(camera); //setCamera
mediaRecorder.setAudiosource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//setProfile
if (f.leer("calidad", context).equals("alta") && qcamara !=10)
mediaRecorder.setProfile(CamcorderProfile.get(0, CamcorderProfile.QUALITY_HIGH));
else if (f.leer("calidad", context).equals("alta") && qcamara == 10)
mediaRecorder.setProfile(CamcorderProfile.get(1, CamcorderProfile.QUALITY_LOW));
else if (f.leer("calidad", context).equals("baja") && qcamara != 10)
mediaRecorder.setProfile(CamcorderProfile.get(0, CamcorderProfile.QUALITY_LOW));
else
mediaRecorder.setProfile(CamcorderProfile.get(1, CamcorderProfile.QUALITY_LOW));
mediaRecorder.setVideoSize(320, 240);
if (CameraRecorder.duracion>0) // -- duration
mediaRecorder.setMaxDuration(CameraRecorder.duracion * 1000);
File dataDirectory = Environment.getExternalStorageDirectory();
File fileDir = new File(dataDirectory, "/weddingR/");
fileDir.mkdirs();
mediaRecorder.setOutputFile( //setOutputFile
Environment.getExternalStorageDirectory()+"/weddingR/"+
DateFormat.format("yyyy-MM-dd---kk-mm-ss", new Date().getTime())+
".mp4"
);
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
if (qcamara==10) // FRONT CAMERA
try mediaRecorder.setOrientationHint(270); catch (Exception e)
else // BACK CAMERA
try mediaRecorder.setOrientationHint(90); catch (Exception e)
try
mediaRecorder.prepare();
catch (Exception e)
mediaRecorder.setOnInfoListener(new OnInfoListener()
@Override
public void onInfo(MediaRecorder mr, int what, int extra)
Log.d("INFO_ON", what + " " + extra + " ");
nascosto=true;
stopSelf();
);
mediaRecorder.start();
例如,如果我设置mediaRecorder.setVideoFrameRate(20)
,它会在每台设备上崩溃。
我最常问的问题是,某些设备可以正常工作,但其他设备不能正常工作(例如,具有 API 17 或 18 的 EMULATOR 可以工作……具有 API 15 的设备可以工作,但 EMULATOR API 15 不能工作……)
我做错了什么??
提前致谢。
ANDROID 清单权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
编辑
@Melquiades 回答后,我编辑了我的代码,现在捕捉异常,没有捕捉到异常。
另外,我想指出一些有趣的事情:我正在尝试使用 API15 模拟器并且发生了这种情况:
-
当我设置
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
(在mediaRecorder.setOutputFile()
之后),我得到START FAILED -19
当我不设置它时,我得到START FAILED -2147483648
但在我的三星中它仍然可以正常工作......
新编辑(01/01/2014)新年快乐!!
我在三星 Galaxy S2 Plus(Android 4.1.2)上试过,但它不起作用,但在我的三星 Galaxy S3 Mini 上它可以工作(也是 Android 4.1.2)......我快疯了。
【问题讨论】:
你应该先解锁相机再做 camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); 在您回答之后,我在 *** 上阅读了一些内容,建议在调用surfaceChanged()
时设置 camera.setPreviewDisplay(surfaceHolder);
和 camera.startPreview();
。我这样做了,但仍然出现错误。
【参考方案1】:
当调用 mediaRecorder.prepare() 时,你没有做任何捕获异常的事情:
try
mediaRecorder.prepare();
catch (Exception e) //empty???
不要这样做。这是一个不好的做法。如果有任何例外,您将不会知道。
在 中放置一个 Log.d() 并查看 prepare() 期间发生了什么。对你捕获的所有异常执行此操作。
来自该指南:
// Step 6: Prepare configured MediaRecorder
try
mMediaRecorder.prepare();
catch (IllegalStateException e)
Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
releaseMediaRecorder();
return false;
catch (IOException e)
Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
releaseMediaRecorder();
return false;
【讨论】:
您好,感谢您的回答。我不习惯做那种不好的做法,但谢谢你提醒我。我正在捕捉异常,我没有异常。它只是崩溃。我正在编辑我的 EDIT,这样你就可以知道如果我修改了一些参数会发生什么。以上是关于MediaRecorder 在某些设备上启动失败(启动失败:-2147483648 和 -19)的主要内容,如果未能解决你的问题,请参考以下文章
使用 MediaRecorder.AudioSource.VOICE_COMMUNICATION 录制的音频在某些搭载 Android 10 的设备上为空
从 MIC 录制并流式传输到 TCP 服务器; MediaRecorder:启动失败:-38
Android mediaRecorder Stop 失败 - 尝试指定设备的最高记录质量