MediaRecorder.stop()与Android 4.0(ICS)挂起
在我的视频捕获活动中调用MediaRecorder.stop()与Android 4.0(ICS)挂起,android,android-4.0-ice-cream-sandwich,freeze,mediarecorder,Android,Android 4.0 Ice Cream Sandwich,Freeze,Mediarecorder,在我的视频捕获活动中调用stop()时,有时软件会挂起,无法恢复使用。只有通过点击“Back”触发ANR,我才能终止活动 在日志中,我看到以下一行反复出现: W/CameraSource(YYYYY):等待传入的摄像头视频超时 帧:XXXXXX美国 还有人见过这种行为吗?有什么解决方法吗?我建议您在后台线程中执行,这样即使stop()方法阻塞,您的应用程序也不会被卡住: new Thread("STOP_RECORDER") { public void run() {
stop()
时,有时软件会挂起,无法恢复使用。只有通过点击“Back”触发ANR,我才能终止活动
在日志中,我看到以下一行反复出现:
W/CameraSource(YYYYY):等待传入的摄像头视频超时
帧:XXXXXX美国
还有人见过这种行为吗?有什么解决方法吗?我建议您在后台线程中执行,这样即使
stop()
方法阻塞,您的应用程序也不会被卡住:
new Thread("STOP_RECORDER") {
public void run() {
Log.d(TAG, "Stopping recorder...");
mediaRecorder.stop();
Log.d(TAG, "Recorder successfully stopped");
}
}.start();
我无意中拒绝了在审查过程中使用“编辑”问题给出的答案: 答复: 我面临同样的问题,我找到的解决方案是添加mCamera.lock();就在mCamera.unlock()之前;在MediaRecorder中设置摄像头之前 看看这个-
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
releaseMediaRecorder();
releaseCamera();
}
private void releaseMediaRecorder(){
if (recorder != null) {
recorder.reset(); // clear recorder configuration
recorder.release(); // release the recorder object
recorder = null;
camera.lock(); // lock camera for later use
}
}
private void releaseCamera(){
if (camera != null){
camera.release(); // release the camera for other applications
camera = null;
}
}
public void stopRecording() { // Toast.makeText(this,"Inside the stop recording",Toast.LENGTH_SHORT).show();
// camera.unlock();
recorder.stop();
// recorder.reset();
recorder.release();#release the recorder after stop important.
}
我们也为这个问题奋斗了很长时间。我们刚刚从android开发者那里复制了用于捕获视频的代码,但在调用mediarecorder.stop()之前,应用程序挂起。在几乎逐行调试之后,我发现了ff。产生问题的原因是:
captureButton.setText("start");
我已将其注释掉,停止mediarecorder将不再导致ANR。我所做的不是改变按钮的文本,而是改变背景
captureButton.setBackgroundResource(R.drawable.icon_post_camera_record_main);
没有看到你的代码,我不确定我们是否有相同的问题原因,但这修复了我的问题。我仍在寻找为什么settext()会出现这种情况,而不是setBackgroundResource。我的猜测是它与后台/异步任务有关,但这仍然是一个猜测。我也遇到了类似的错误。我的活动包含一个显示预览的变异SurfaceView,因此在我开始录制后,SurfaceView的宽度缩小,我无法停止录制,因此出现ANR错误
我通过修复SurfaceView的维度解决了这个问题。希望它有帮助可能您正在onCreate()中启动预览和媒体录制器初始化。将其移动到稍后的点或添加
新的Handler.postDelayed(runnable,1000)代码>在我的例子中,发生这种情况的原因是我停止了相机预览,更改了预览分辨率,然后在录制过程中重新启动了预览。如果压缩所有方法调用,则会出现如下情况:
camera.startPreview();
camera.unlock();
recorder = new MediaRecorder();
recorder.setCamera(camera);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoFrameRate(24);
recorder.setVideoEncodingBitRate(3000000);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setOutputFile(output.getAbsolutePath());
recorder.setPreviewDisplay(holder.getSurface());
recorder.prepare();
recorder.start();
camera.stopPreview();
Camera.Parameters cameraParameters = camera.getParameters();
cameraParameters.setPreviewSize(x, y);
camera.setParameters(cameraParameters);
camera.startPreview();
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
camera.lock();
camera.stopPreview();
实际上,录制开始后更改预览大小的原因是复杂的,并且是特定于域的,因此我将保存详细信息。但是,要点是相同的:如果不停止预览,就无法更改预览大小,但在媒体录制器启动后,就无法停止预览。我敢肯定还有其他因素可能导致这种情况,就像任何其他数量的相机参数一样
您应该确保在录制视频时检查摄像机是否受到干扰。我也遇到过这种情况,因为我在对摄像机执行stop()之前松开了摄像机。它还解释了错误消息“等待传入的摄像头视频帧超时”。它正在等待一个已经发布的摄像头。
确保停止录音机,然后才松开摄像机:
mMediaRecorder.stop();
mMediaRecorder.release();
camera.stopPreview();
camera.release();
在我的情况下,我一直试图停止录制活动。当我将呼叫移动到MediaRecorder时,停止录制到活动。onPause
解决了我的问题。您能提供一些“视频捕获活动”的代码吗?特别是在方法stop()被调用的地方,有关于这个的更多信息吗?这里有完全相同的问题。我在尝试运行第16章的VoiceRecorder演示应用程序时遇到了相同的问题。Deitel等人的《程序员的Android》。我有一个含姜饼的硝基HD。糟糕的是,我必须重新启动手机才能释放MediaRecorder…:-(同上..我也遇到了同样的问题..取消setText的注释对我来说很有效。这个答案需要更多的解释才能有用。谢谢你的回答。我花了两天时间努力解决这个问题。救世主!这应该是答案:)