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

在video捕捉活动中调用stop() ,有时候软件会起而不会恢复原样。 只有通过点击“返回”来触发ANR才能让我杀死这个活动。

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

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

有没有其他人看到这种行为? 任何解决方法?

Solutions Collecting From Web of "MediaRecorder.stop()挂在Android 4.0(ICS)"

我们也一直在努力解决这个问题。 我们刚刚从android开发人员网站复制了代码以捕获video,但在调用mediarecorder.stop()之前应用程序挂起。 几乎一行一行的debugging,我发现了ff。 线路导致的问题:

 captureButton.setText("start"); 

我已经评论了,停止录像机将不再导致ANR。 我所做的不是改变button的文字,而是改变背景。

 captureButton.setBackgroundResource(R.drawable.icon_post_camera_record_main); 

没有看到你的代码,我不知道我们是否有同样的问题的原因,但这解决了我的问题。 我仍然在寻找为什么会发生settext()而不是setBackgroundResource。 我的猜测是,它与背景/asynchronous任务有关,但这仍然是一个猜测。

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

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

我build议你在后台线程中这样做,这样即使stop()方法阻塞,你的应用也不会卡住:

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

在审查过程中,我不小心拒绝了一个答案,这个答案是使用这个问题的“编辑”

user2171513回答:

我遇到了同样的问题,我find的解决scheme是添加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()中启动预览和媒体logging器初始化。 将其移到稍后的点或添加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.onStoplogging,当我把调用MediaRecorder.stopActivity.onPause它解决了我的问题。