在视频录制期间使用PreviewCallback时,Android的MediaRecorder上出现死锁

时间:2013-11-14 15:25:28

标签: android multithreading camera mediarecorder

在一些问题之后,我终于使用MediaRecorder在我的应用程序中设置了视频录制。

我现在要做的是在录制过程中处理尽可能多的预览帧。即我想抓住预览框架,处理它并在处理这个预览框架时忽略它们。一旦完成处理,我想继续下一个进来。

为此我尝试了两种不同的方法:

  1. 通过Camera.addCallbackBuffer()添加两个缓冲区并让一个线程处理其中一个缓冲区,而PreviewCallback会在帧传入时立即重新添加当前“未使用”的缓冲区。

  2. 使用setOneShotPreviewCallback(),再次处理回调方法中的帧和setOneShotPreviewCallback()。

  3. 一帧的处理大约需要500毫秒。

    通过这两种方法,我得到了两个问题:

    1. 预览帧率(在TextureView上)减少很多
    2. 主要问题:在大多数情况下,我在录制过程中或录制结束时会遇到某种死锁。
    3. 这就是我所做的(使用setOneShotPreviewCallback() - 方法):

      MediaRecorder mr = new MediaRecorder();
      (prepare Recorder...)
      
      mr.start();
      cam.setOneShotPreviewCallback(myCallbackObject);
      

      然后,从另一个线程我停止录制:

      mr.stop();
      cam.setPreviewCallback(null);
      ...
      

      这就是回调方法的作用:

      (do something with the data buffer)
      cam.setOneShotPreviewCallback(this);
      

      在大多数情况下,我的代码卡在

      mr.stop();
      

      但有时也在

      cam.setOneShotPreviewCallback(this);
      

      在回调中。

      非常感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

处理一个帧需要足够长的时间来证明a)在AsyncTask中运行它并且b)将预览帧复制到另一个字节[]。

setOneShotPreviewCallback()似乎是一个不错的选择,但是将像素复制到预分配的数组并尽快从onPreviewFrame()返回。