Android 4.0(ICS)下MediaRecorder.stop()无响应

22

在我的视频捕获活动中调用stop()时,有时软件会挂起并且无法恢复。只有通过点击“返回”触发ANR才能让我终止活动。

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

W/CameraSource(YYYYY): 等待传入摄像机视频帧超时:XXXXXX微秒

其他人有没有看到过这种行为?有什么解决方法吗?


你能提供一下你的“视频捕获活动(Video Capture activity)”的一些代码吗?特别是在哪里调用了stop()方法。 - HitOdessit
9个回答

5

我曾经也遇到过这个问题,因为在执行stop()函数之前,我先释放了相机。这也解释了错误信息“Timed out waiting for incoming camera video frames”。原因是等待已经被释放的相机。 确保先停止录制器,然后再释放相机:

mMediaRecorder.stop();
mMediaRecorder.release();

camera.stopPreview();
camera.release();

5
我们也长时间为此问题苦苦挣扎。我们刚刚从安卓开发者网站site复制了捕获视频的代码,但在mediarecorder.stop()被调用之前,应用程序会挂起。经过几乎逐行调试,我发现以下行导致了该问题:
captureButton.setText("start");

我已将其注释掉,停止mediarecorder不再导致ANR。我的做法是,而不是改变按钮的文本,我只是改变了背景。

captureButton.setBackgroundResource(R.drawable.icon_post_camera_record_main);

没有看到您的代码,我不确定我们是否遇到了相同的问题,但这个解决方法修复了我的问题。我仍在寻找为什么对于settext()会发生这种情况而对于setBackgroundResource不会发生。我猜测这与背景/异步任务有关,但这仅是一个猜测。


0
在我的情况下,发生这种情况的原因是我停止了相机预览,更改了预览分辨率,然后重新启动了预览,同时还在录制。如果压缩所有方法调用,就像这样:
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();

实际上,录制开始后更改预览大小的原因很复杂且与领域有关,因此我将保存细节。 但是,重点是一样的:您无法在停止它之前更改预览大小,但是在媒体记录器启动后无法停止预览。 我相信还有其他可能导致这种情况发生的问题,例如任何其他摄像机参数。

您应该确保在录制视频时不要干扰摄像头。


0
我建议您在后台线程中执行此操作,这样即使stop()方法阻塞,您的应用程序也不会被卡住。
    new Thread("STOP_RECORDER") {
        public void run() {
            Log.d(TAG, "Stopping recorder...");
            mediaRecorder.stop();
            Log.d(TAG, "Recorder successfully stopped");
        }
    }.start();

0
我在审核过程中意外拒绝了一个使用问题的“编辑”给出的答案: user2171513回答道:

我遇到了同样的问题,我找到的解决方案是在相机设置到MediaRecorder之前添加mCamera.lock(); right before mCamera.unlock();。


0

可能你正在onCreate()中开始预览和媒体录制初始化。将其移动到稍后的时间点或添加new Handler.postDelayed(runnable, 1000);


0
我也遇到了类似的错误。我的Activity包含一个可变的SurfaceView,用于显示预览。因此,在我开始录制后,SurfaceView的宽度会缩小,导致我无法停止录制并出现ANR错误。我通过修复SurfaceView的尺寸来解决这个问题。希望对你有所帮助。

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

0

看看这个 -

            @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.

    }

2
这个答案需要更多的解释才能有用。 - Frank Schwieterman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接