我正在使用MediaRecorder录制视频。我的代码在2.3.3上工作正常但在4.0.3上失败。
问题如下:代码mediaRecorder.stop()抛出RuntimeExeption
java.lang.RuntimeException: stop failed.
at android.media.MediaRecorder.stop(Native Method)
使用LogCat消息
04-05 15:10:51.815: E/MediaRecorder(15709): stop failed: -1007
更新
我发现,MediaPlayer几乎在启动后立即报告错误(通过MediaPlayer.OnErrorListener)。错误代码为100(媒体服务器死亡),额外-1007。
更新2 准备MediaRecorder的代码
c = Camera.open();
...
// Step 1: Unlock and set camera to MediaRecorder
camera.unlock();
mediaRecorder.setCamera(camera);
// Step 2: Set sources
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
CamcorderProfile profile = CamcorderProfile
.get(CamcorderProfile.QUALITY_HIGH);
// manual set up!
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
mediaRecorder.setVideoFrameRate(profile.videoFrameRate);
mediaRecorder.setVideoSize(profile.videoFrameWidth,
profile.videoFrameHeight);
mediaRecorder.setAudioChannels(profile.audioChannels);
mediaRecorder.setAudioEncodingBitRate(profile.audioBitRate);
mediaRecorder.setAudioSamplingRate(profile.audioSampleRate);
mediaRecorder.setAudioEncoder(profile.audioCodec);
//mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mediaRecorder.setVideoEncoder(profile.videoCodec);
// mediaRecorder.setProfile(profile);
// Step 4: Set output file
mediaRecorder.setOutputFile("somefile.mp4");
// Step 5: Set the preview output
mediaRecorder.setPreviewDisplay(preview.getHolder().getSurface());
// Step 6: Prepare configured MediaRecorder
try {
mediaRecorder.prepare();
} catch ...
{ release mediaRecorder}
然后我简单地调用mediaRecorder.start() 请注意,我需要将视频编码为mp4格式。 此代码适用于Samsng Galaxy GIO(android 2.3.3),并且如Acer E305(android 4.0.2)所述失败
有什么想法吗? 感谢。
答案 0 :(得分:22)
终于解决了。 问题是在设置相机的实际预览之前设置预览大小。预览尺寸必须等于所选的视频尺寸。
CamcorderProfile profile = [get required profile];
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(profile.videoFrameWidth,profile.videoFrameHeight);
mCamera.setParameters(parameters);
mCamera.setPreviewDisplay([surface holder]);
mCamera.startPreview();
...
//configure MediaRecorder and call MediaRecorder.start()
答案 1 :(得分:15)
在4.0.3中的MediaRecorder.java中引用“stop”方法的文档:
停止录制。在start()之后调用它。录制停止后, 你将不得不重新配置它,就像它刚刚一样 建造。请注意,有意抛出RuntimeException 如果没有收到有效的音频/视频数据,则应用程序 调用stop()。如果立即调用stop(),则会发生这种情况 开始()。失败让应用程序相应地采取行动 清理输出文件(例如删除输出文件),因为 发生这种情况时,输出文件没有正确构建。
MediaPlayer报告这个“媒体服务器已经死亡”的事实也是出于同样的原因。您是否可以发布其余代码以查看是否存在可能导致此问题的误解?
答案 2 :(得分:1)
我在Samsung J4 +,Android 9 Pie上遇到了相同的问题。
通过在处理程序中运行mediaRecorder.start()和mediaRecorder.stop()修复了此问题:
private val START = 0;
private val STOP = 1;
inner class CameraHandler(looper: Looper?): Handler(looper) {
override fun handleMessage(msg: Message?) {
super.handleMessage(msg)
try {
when (msg?.what) {
START -> mediaRecorder?.start()
STOP -> mediaRecorder?.stop()
}
} catch (e: Exception) {
Log.d("debug", e.message)
}
}
}
声明处理程序:
private lateinit var mCameraHandler: Handler
使用HandlerThread Looper在OnCreate中初始化
:val handlerThread: HandlerThread = HandlerThread("Camera Handler Thread")
handlerThread.start()
mCameraHandler = CameraHandler(handlerThread.looper)
当单击“录制”或“停止”按钮时,呼叫:
mCameraHandler.sendEmptyMessage(START)
mCameraHandler.sendEmptyMessage(STOP)
答案 3 :(得分:1)
我在某些设备上出现-1007错误,主要是android 9,最后我解决了这个问题。原因是OMX.google.h264.encoder仅支持可被16均分的视频尺寸。 我将displayMetrics.widthPixels和displayMetrics.heightPixels用作视频大小,但并非所有设备都满足要求。
希望这对某人有帮助!
答案 4 :(得分:0)
所以我发现在Android模拟器上为API报告了这个错误(在更高版本的录制后工作正常)。
我发现如果我在初始化并开始启动Camera.startPreview()
实例之前调用了MediaRecorder
,那么在调用stop failed: -1007
时我会得到MediaRecorder.stop
日志,但是如果我在初始化Camera.stopPreview()
之前致电MediaRecorder
,视频会录得很好。
我希望这会有所帮助
答案 5 :(得分:0)
我发布了一个很好的解决方法来确定 MediaRecorder
是否为 prepared
和 started
。简而言之,您应该检查 MediaRecorder.maxAmplitude > 0
是否记录了任何内容。我正在使用一个助手处理这个问题,该助手会不断检查条件,直到它大于零。在此处阅读完整说明:https://stackoverflow.com/a/66821059/15389960