我已经看到问题 Record video from camera parallel to OpenCV processing on android关于类似的问题,但没有回答。 我看到两种可能性:
使用标准 android 工具 MediaRecorder 从摄像头录制视频,并在 previewCallback 中使用 OpenCV 同时处理 byte[] 数组。
像在 Gragika 项目中一样使用 MediaCodec 录制视频 https://github.com/google/grafika .录制时使用纹理中的 glReadPixels 并将其传递给 OpenCV Mat 进行处理。
还有什么更好的或者可能存在另一种方法?
最佳答案
我已经解决了。
对于你提到的第一种方式:
在准备 MediaRecorder 之前锁定相机。
在 mediaRecorder 的
start()
方法之后立即调用reconnect()
重新锁定相机。
但是,由于 API 级别 14,相机可以在调用 start()
后自动重新锁定,因此实际上您不需要 reconnect()
。
- 设置预览回调。如果您想获得更高的帧率,请使用
setPreviewCallbackWithBuffer()
并设置多个回调缓冲区。
但根据我的实验,来自预览回调的帧和由 MediaRecorder 记录的帧是异步的。因此,如果需要,很难保证帧同步。
对于第二种方式:您可以完全控制框架。
感谢 fadden 的项目,我成功地在进行图像处理的同时进行了录制,通过使用 MediaCodec 对来自预览回调的视频帧进行编码,并通过 JNI 将预览数据传递给本地层,以便使用 OpenCV 进行图像处理。
需要注意的是,为了实时效率,必须在另一个线程中进行处理,并保证与编码线程同步。
关于android - 在 android 上从摄像头进行 OpenCV 处理和写入视频的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34764846/