android - 在 android 上从摄像头进行 OpenCV 处理和写入视频的最快方法?

标签 android opencv android-camera android-mediacodec

我已经看到问题 Record video from camera parallel to OpenCV processing on android关于类似的问题,但没有回答。 我看到两种可能性:

  1. 使用标准 android 工具 MediaRecorder 从摄像头录制视频,并在 previewCallback 中使用 OpenCV 同时处理 byte[] 数组。

  2. 像在 Gragika 项目中一样使用 MediaCodec 录制视频 https://github.com/google/grafika .录制时使用纹理中的 glReadPixels 并将其传递给 OpenCV Mat 进行处理。

还有什么更好的或者可能存在另一种方法?

最佳答案

我已经解决了。

对于你提到的第一种方式:

  1. 在准备 MediaRecorder 之前锁定相机。

  2. 在 mediaRecorder 的 start() 方法之后立即调用 reconnect() 重新锁定相机。

但是,由于 API 级别 14,相机可以在调用 start() 后自动重新锁定,因此实际上您不需要 reconnect()

  1. 设置预览回调。如果您想获得更高的帧率,请使用 setPreviewCallbackWithBuffer() 并设置多个回调缓冲区。

但根据我的实验,来自预览回调的帧和由 MediaRecorder 记录的帧是异步的。因此,如果需要,很难保证帧同步。

对于第二种方式:您可以完全控制框架。

感谢 fadden 的项目,我成功地在进行图像处理的同时进行了录制,通过使用 MediaCodec 对来自预览回调的视频帧进行编码,并通过 JNI 将预览数据传递给本地层,以便使用 OpenCV 进行图像处理。

需要注意的是,为了实时效率,必须在另一个线程中进行处理,并保证与编码线程同步。

关于android - 在 android 上从摄像头进行 OpenCV 处理和写入视频的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34764846/

相关文章:

c++ - 为什么 ExposureCompensator 结果给出黑色图像?

python - 如何继续处理车牌裁剪?

android - 什么是 setDisplayOrientation() 的 Camera2 API 等效项?

android - Android 设备能否同时在外设和中央模式下运行低功耗蓝牙?

android - 删除一对多关系 Room Kotlin 中的所有值

android - 如何在单击时不更改底部导航 View 项目颜色

c - 使用 gcc 时 opencv 库中的链接错误

java - 使用变量来替换一些常量的Android API

java - FRONT_CAMERA 不支持 d 错误 : Video Chat Feature powered by Applozic

Android Google SignIn 无法在 Debug模式下工作 : GoogleSignInResult is false