MediaRecorder.stop()挂在Android 4.0(ICS)

在我的video捕获活动中调用stop() ,软件有时会挂起并且不会恢复生命。 只有通过点击“返回”触发ANR才能杀死活动。

在日志中,我看到以下一行一遍又一遍地重复:

W / CameraSource(YYYYY):等待传入的摄像机video帧超时:XXXXXX us

有没有人见过这种行为? 有任何变通方法吗?

我们长期以来一直在努力解决这个问题。 我们刚刚从android开发者网站复制代码来捕获video,但应用程序在调用mediarecorder.stop()之前挂起。 经过几乎逐行调试,我发现了ff。 线导致问题:

 captureButton.setText("start"); 

我已经评论过它并且停止媒体记录将不再导致ANR。 我所做的不是改变按钮的文本,而是改变背景。

 captureButton.setBackgroundResource(R.drawable.icon_post_camera_record_main); 

没有看到你的代码,我不确定我们是否有相同的问题原因,但这解决了我的问题。 我仍在搜索为什么这会发生在settext()而不是setBackgroundResource。 我的猜测是它与背景/异步任务有关,但它仍然是猜测。

这也发生在我身上,因为我在录音机上执行stop()之前释放了相机。 它还解释了错误消息“超时等待传入的摄像机video帧”。 它正在等待已经发布的相机。 确保停止录像机 – 然后才释放相机:

 mMediaRecorder.stop(); mMediaRecorder.release(); camera.stopPreview(); camera.release(); 

我建议您在后台线程中执行此操作,以便即使stop()方法阻止,您的应用也不会卡住:

  new Thread("STOP_RECORDER") { public void run() { Log.d(TAG, "Stopping recorder..."); mediaRecorder.stop(); Log.d(TAG, "Recorder successfully stopped"); } }.start(); 

我在使用“编辑”问题的评论期间意外拒绝了答案:

user2171513回答:

我遇到了同样的问题,我find的解决方案是添加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. } 

我也有这样的错误。 我的活动包含一个显示预览的变异SurfaceView,因此在我开始录制后,SurfaceView的宽度缩小,我无法停止录制,得到ANR错误。我通过修复SurfaceView的尺寸来解决问题。希望它有用

可能你正在onCreate()中启动预览和媒体记录器init。 将其移至稍后的位置或添加new 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(); 

实际上,在录制开始后更改预览大小的原因很复杂且特定于域,因此我将保存详细信息。 但是,重点是:您无法在不停止的情况下更改预览大小,但在媒体录制器启动后无法停止预览。 我确信还有其他可能导致这种情况的事情,就像任何其他数量的相机参数一样。

录制video时,请务必检查相机是否受到干扰。

在我的情况下,我一直试图停止在Activity.onStop录制,当我将调用MediaRecorder.stop移动到Activity.onPause时解决了我的问题。