在视频录制过程中使用预览回调时Android的MediaRecorder上的死锁



经过一些问题,我终于设法使用MediaRecorder在我的应用程序中进行视频录制。

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

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

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

  2. 使用 setOneShotPreviewCallback(),在回调方法中处理帧,然后再次设置OneShotPreviewCallback()。

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

使用这两种方法,我都会遇到两个问题:

  1. 预览帧率(在纹理视图上)降低了很多
  2. 主要问题:在大多数情况下,我在录制期间或录制结束时会出现某种死锁。

这就是我所做的(使用 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);

在回调内。

提前非常感谢任何建议!

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

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

最新更新