繁体   English   中英

Android中的多线程实时摄像头处理

[英]Multithreaded real time camera processing in Android

目标是在Android设备的实时预览中实现实时图像处理。 这已经在这里解决了很多次,并且在Web上有一些提及(请参阅问题末尾的参考资料),但是,我还没有找到关于实现此目标的适当多线程框架的任何建议。

据我了解,要正确使用多线程(以及具有多个物理核心的设备),应实现以下目标:

  1. 在UI线程( onCameraPreview )上调用帧处理程序,并将帧数据排队到共享队列Q
  2. n线程的线程池在Q上等待。 每个线程都会在可能的情况下出帧一个帧,进行“大量”图像处理,并将消息与结果一起发送到UI线程。

我的主要问题是上述方法是否正确,以及如何在Android上准确实现。 同样,如果必须串行执行图像处理,即在任何给定时间处理的帧数不超过一帧,但仍然在与主线程分开的线程上进行处理,将需要进行哪些修改。


更新1:
我最终将其实现为一个AsyncTask ,它接收原始帧数据作为输入,并使用onPostExecute回调来更新UI。 但是,这种情况大约每秒发生10次,这使我怀疑它是否不会产生太多开销。 这就是为什么就我而言,这个问题仍未得到验证,这确实是最有效的方法。 同样,我仍然不清楚如何将这种方法扩展到多个内核上的多个工作线程。


相关问题:
-Android中的视频处理
- 具有多线程功能的Android相机框架处理
-Android:如何实时记录视频并处理其帧?
- 实时处理Android相机帧
- 为实时计算机视觉处理获得高FPS的方法
-openCV4Android中的多线程
-Android:实时图像处理
-Android视频帧处理
- 同步摄像头预览和处理
- 使用NDK在Android中进行实时图像处理
-Android相机预览过滤
- 在录制视频时如何显示实时过滤的摄像机预览?

和链接:
http://ibuzzlog.blogspot.co.il/2012/08/how-to-do-real-time-image-processing-in.html

Android文档指出,使用byte []数组对“ onPreviewFrame()”进行的调用无法放入队列或其他内容,因为该数组在每次调用后都会被重用。 必须尽快返回该呼叫以获得更好的帧率。

这就是您可以做的(我做到了,得到了29 FPS)

  1. 通过JNI调用将数组传递给本机c或c ++库

  2. 在您的C程序中实现一个队列,并分配一个节点来存储此数组

  3. 内存复制数组并返回调用。

  4. 并回电

  5. 将节点排入队列进行处理,将节点排入队列以使用某些编码器(例如FFMPEG)进行处理

  6. 并行运行此排队过程和编码过程,以便在对帧进行编码后,可以从内存中清除该帧,以防止内存溢出。

  7. 并记住选择最佳分辨率,以使编码器与输入帧速率的速度相匹配,从而不会因队列而导致内存溢出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM