我之前的回答不完整。经过更多的修补后,我发现许多设备可能对您认为大多数设备的默认设置非常敏感,但实际上有许多设备的行为方式与您预期的不同,它们会崩溃,给您带来许多不同的错误您将无法在 Internet 上找到的代码。这些错误代码的范围从 -12、-19、-21 到 -100 等,并且这些错误代码中的大多数都可以通过使用以下提示来解决。我将在下面给出一个简短的调查结果列表:
运行API 10的HTC ChaCha不使用 H264 编码器进行录制。我使用 MP4 和/或 H263 让它工作,但视频仍然完全失真。解决方案是将相机预览大小设置为 640*480,而不是使用谷歌自己的返回 576*432 的“最佳预览”方法。通过为这个模型设置例外,我能够让它完美地记录下来。
尝试使用 H264 录制时,运行API 10的Galaxy Y崩溃。这个例外使用 MP4 编码器。修复。
尝试使用 MP4 录制时,运行API 10的Galaxy Ace崩溃,返回错误代码 -12。使用 H264 编码器为此设备型号添加异常可解决此问题。
尝试使用 MP4 编码器录制时,运行API 10的Desire Z崩溃。给我一个错误-100(媒体服务器死机)。使用 H264 解决了这个问题。
if(API >=11){
if(CamcorderProfile.hasProfile(mCamId, CamcorderProfile.QUALITY_480P)) {
Log.d(TAG, "API 11+ 480P");
mMediaRecorder.setProfile(CamcorderProfile.get(mCamId, CamcorderProfile.QUALITY_480P));
mMediaRecorder.setVideoSize(640, 480);
mMediaRecorder.setVideoEncodingBitRate(2000000);
} else {
Log.d(TAG, "API 11+ LOW");
mMediaRecorder.setProfile(CamcorderProfile.get(mCamId, CamcorderProfile.QUALITY_LOW));
}
} else if (API < 11 && !MODEL.equals("GT-S5830") && !MODEL.equals("vision")){
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
Log.d(TAG, "API 9 device, defaulting");
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setVideoSize(640, 480);
mMediaRecorder.setVideoEncodingBitRate(2000000);
} else if ((API < 11) && MODEL.equals("GT-S5830") || MODEL.equals("vision")) {
//Galaxy Ace and Desire Z
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setVideoSize(640, 480);
mMediaRecorder.setVideoEncodingBitRate(2000000);
}
我敢打赌,我会遇到更多的模型作为隐喻的痛苦,当我这样做时,我会将它们添加到列表中。总结一下; 如果您遇到这些烦人的、几乎无法解释的错误代码,请查看 MediaRecorder 参数。我建议不要对任何低于 11 的 API 使用 CamcorderProfile 类,因为其中许多模型在使用它的高质量实例时会崩溃。如果您的录像机视频文件显示奇怪的绿色、穿过屏幕的半对角线等,请尝试将预览大小设置为与录像机视频大小相匹配。
Camera.Parameters param = mCamera.getParameters();
param.setPreviewSize(width, height);
mCamera.setParameters( param );