0

我正在开发一个 android 应用程序,它使用 opencv 库提供的类 org.opencv.android.JavaCameraView 打开视频流,并从中捕获帧,以便在它们显示在屏幕上之前对其进行处理。

应用程序以这种方式组织:

  1. 主线程,有 OnCameraFrame 方法,获取帧并发送给线程 A,该方法还负责在屏幕上显示最后一帧。所以所有的处理都应该在帧被获取之后,在屏幕上显示之前,在这个方法的“中间”进行。

  2. 线程 A,将获取的帧保存到缓冲区 BlockingLinkedQueue 中;

  3. 线程B,它从缓冲区中取出一个帧,并将其发送到负责处理的线程C;

  4. 处理帧的线程C,并将其发送到主线程。

所以问题是:我怎样才能阻止方法 OnCameraFrame,所以它不能在屏幕上显示任何帧,直到它从最后一个线程(C)返回?如果我不实现这种类型的任何东西,因为处理需要一些时间,我不会在屏幕上正确看到最终帧。

我希望我已经清楚地解释了我的问题。

4

2 回答 2

0

该方法将是Thread.join(),但您通常不应在主线程中调用它。相反,您不应该在您的计算机中显示任何内容,onCameraFrame()但在计算结束时,线程 C 可以调用例如Activity.runOnUiThread()代码以显示框架。

于 2013-06-22T15:19:56.653 回答
0

最好避免阻塞回调 - 取决于调用线程,您最终可能会遇到 ANR。在回调和处理线程之间添加一个队列。

我不知道为什么你需要这么多线程和一个阻塞队列——创建一个线程,在这个线程上创建一个处理程序,在主线程上创建一个处理程序。当您在回调中收到一个帧时 - 将其发布到处理线程处理程序,当它完成处理时 - 将结果发布到主线程处理程序。

于 2013-06-22T15:34:17.867 回答