Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android中的多线程实时摄像机处理_Java_Android_Multithreading_Video Processing - Fatal编程技术网

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

Java Android中的多线程实时摄像机处理,java,android,multithreading,video-processing,Java,Android,Multithreading,Video Processing,目标是在Android设备的实时预览上实现实时图像处理。这个问题在这里已经讨论过很多次了,在网络上也有一些提及(参见问题末尾的参考文献),但是,我还没有找到一个合适的多线程框架来实现这一点的建议 据我所知,要正确使用多线程(以及具有多个物理核心的设备),需要实现以下功能: 在UI线程(onCameraPreview)上调用框架处理程序,并将框架数据排入共享队列Q n线程的线程池在Q上等待。每个线程在任何时候都会释放一个帧,执行“重”图像处理,并将结果发布到UI线程 我的主要问题是,上述内容是否是

目标是在Android设备的实时预览上实现实时图像处理。这个问题在这里已经讨论过很多次了,在网络上也有一些提及(参见问题末尾的参考文献),但是,我还没有找到一个合适的多线程框架来实现这一点的建议

据我所知,要正确使用多线程(以及具有多个物理核心的设备),需要实现以下功能:

  • 在UI线程(
    onCameraPreview
    )上调用框架处理程序,并将框架数据排入共享队列
    Q
  • n
    线程的线程池在
    Q
    上等待。每个线程在任何时候都会释放一个帧,执行“重”图像处理,并将结果发布到UI线程
  • 我的主要问题是,上述内容是否是正确的方向,以及如何在Android上实现。此外,如果图像处理必须以串行方式进行,即在任何给定时间处理的帧不超过1帧,但仍在主线程之外的线程上进行处理,则需要进行哪些修改


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


    相关问题:
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    和链接:

    Android文档指出,对带有byte[]数组的“onPreviewFrame()”的调用不能放入队列或其他内容中,因为每次调用后都会重复使用该数组。必须尽快返回调用以获得更好的帧率

    这就是你能做的(我做到了,每秒29帧)

    > P>通过JNI调用< /P> 将数组传递给本机C或C++库
  • 在C程序中实现一个队列,并在一个节点上malloc来存储这个数组

  • 内存复制数组并返回调用

  • 然后回电话

  • 将节点排队以进行处理,并使用某些编码器(如FFMPEG)将节点解排队以进行处理

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

  • 请记住选择最佳分辨率,以便编码器与输入帧速率的速度匹配,这样就不会因为队列而导致内存溢出


  • 我仍在寻找这个问题的答案,如果有人能帮忙的话。。。如果有人发现问题不够清晰,我会很乐意编辑/添加信息。一个让我的研究漏掉并准确回答我问题的问题是。斯塔夫,我正在尝试一些非常类似的方法,并找到了你的帖子。我也读了你说的回答你问题的帖子,但我不理解其中的重要部分,所以我问了他一个问题。然后意识到你肯定已经解决了这个问题,因为你最近的帖子比他还多,也许你可以帮我。他写道“通过固定的延迟将每个线程分开”。如果内核并行处理,为什么会有帮助?那么,您如何通过一个固定的延迟来分隔每个线程呢?一旦你启动了一个线程,它运行时不考虑它是在什么时候与其他线程相关的情况下产生的吗?好吧,我还没有实现它,我认为@Rick77的答案没有回答的真正开放的问题是如何准确地实现线程池。但是,根据您的问题——延迟对性能没有帮助——但对于大多数用例来说可能更有意义。如果您的处理返回用户一些关于当前帧的有意义的答案,那么您希望这些答案在时间上均匀分布。这是让用户感觉处理一直在进行的最有效的方法。谢谢你的回答,不过,我只想用Java来做这件事。挑战在于实现一个适当的线程池,该线程池可以针对您描述的队列工作。另外,虽然我觉得我知道一般框架应该是什么样子,但我更感兴趣的是实现细节——即使用哪些线程工具等等。