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的注释对我来说很有效。这个答案需要更多的解释才能有用。谢谢你的回答。我花了两天时间努力解决这个问题。救世主!这应该是答案:)