我正在开发一个Android应用程序,它使用opencv库提供的类org.opencv.android.JavaCameraView打开视频流,并从中捕获帧,以便在它们显示在屏幕上之前处理它们。
应用程序以这种方式组织:
主线程,具有OnCameraFrame方法,获取帧并将其发送到线程A,此方法还负责在屏幕上显示最终帧。因此,所有处理都应在获取帧之后,在屏幕上显示之前,在此方法的“中间”执行。
线程A,它将获取的帧保存到缓冲区中,BlockingLinkedQueue;
线程B,从缓冲区获取一个帧,并将其发送给负责处理的线程,线程C;
处理框架的线程C,并将其发送到主线程。
所以问题是:如何阻止方法OnCameraFrame,所以它不能在屏幕上显示任何帧,直到它从最后一个线程(C)返回?如果我没有实现这种类型的任何东西,由于处理需要一点时间,我没有在屏幕上正确看到最终帧。
我希望我能清楚地解释我的问题。
答案 0 :(得分:0)
该方法为Thread.join()
,但通常不应在主线程中调用它。相反,你应该不在你的onCameraFrame()
中显示任何内容,但在计算结束时,线程C可以调用例如Activity.runOnUiThread()
。 {{1}}代码显示框架。
答案 1 :(得分:0)
最好避免阻塞回调 - 取决于调用线程,你可能最终得到ANR。在回调和处理线程之间添加一个队列。
我不确定为什么你需要这么多线程和阻塞队列 - 制作一个线程,在这个线程上创建一个Handler,在主线程上创建一个Handler。当你在回调中收到一个帧时 - 将它发布到处理线程处理程序,当它完成处理时 - 将结果发布到主线程处理程序。