在一些问题之后,我终于使用MediaRecorder在我的应用程序中设置了视频录制。
我现在要做的是在录制过程中处理尽可能多的预览帧。即我想抓住预览框架,处理它并在处理这个预览框架时忽略它们。一旦完成处理,我想继续下一个进来。
为此我尝试了两种不同的方法:
通过Camera.addCallbackBuffer()添加两个缓冲区并让一个线程处理其中一个缓冲区,而PreviewCallback会在帧传入时立即重新添加当前“未使用”的缓冲区。
使用setOneShotPreviewCallback(),再次处理回调方法中的帧和setOneShotPreviewCallback()。
一帧的处理大约需要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);
在回调中。
非常感谢您的任何建议!
答案 0 :(得分:0)
处理一个帧需要足够长的时间来证明a)在AsyncTask中运行它并且b)将预览帧复制到另一个字节[]。
setOneShotPreviewCallback()似乎是一个不错的选择,但是将像素复制到预分配的数组并尽快从onPreviewFrame()返回。