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