经过一些问题,我终于设法使用MediaRecorder在我的应用程序中进行视频录制。
我现在想做的是在录制过程中处理尽可能多的预览帧。 即我想抓取一个预览帧,处理它并在处理此预览帧时忽略任何预览帧。一旦完成处理,我想继续下一个进来。
为此,我尝试了两种不同的方法:
-
通过 Camera.addCallbackBuffer() 添加两个缓冲区,并让一个线程处理其中一个缓冲区,而每当帧传入时,PreviewCallback 会立即重新添加当前"未使用"的缓冲区。
-
使用 setOneShotPreviewCallback(),在回调方法中处理帧,然后再次设置OneShotPreviewCallback()。
处理一帧大约需要 500 毫秒。
使用这两种方法,我都会遇到两个问题:
- 预览帧率(在纹理视图上)降低了很多
- 主要问题:在大多数情况下,我在录制期间或录制结束时会出现某种死锁。
这就是我所做的(使用 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() 返回。