0

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

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

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

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

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

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

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

  1. 预览帧率(在 TextureView 上)降低了很多
  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);

回调里面。

非常感谢您的任何建议!

4

1 回答 1

0

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

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

于 2013-11-14T21:43:19.643 回答