2008-11-10 34 views
1

背景将图像从C程序移动到Java并显示在屏幕上的最有效方法?

我使用video4linux 2规范捕获视频。它是使用C程序实时捕获的。我也有一个可以在本地和远程运行的Java前端。远程方面很简单,我只是将图像压缩为JPEG格式,然后通过迷你http服务器将它们发送给客户端,客户端将其解压缩并显示在屏幕上。

当我们在本地运行时,我想以某种方式直接连接到内存并从Java访问图像。然后,尽可能使用尽可能小的CPU功率将它们移动到屏幕上。这是一个“监视”型系统,所以我可以一次运行8-16个摄像头。

问题

什么是从V4L2的mmap缓冲区中的图像数据(YUV420P)移动到我的Java应用程序,以显示在屏幕上的最有效方法是什么?如果有任何可用的,请显示代码或指向我的一些API /规范。

回答

在时间的关系,我决定只使用纯套接字和RGB发送数据。当Java客户端在同一台计算机上运行时,我能够显着提高性能。如果客户端正在远程运行,我仍然通过网络发送JPEG。接下来,我需要找到一个优化的JPEG解码器。

顺便说一句,这不是2个客户端,只是我的CameraStream小部件读取和解析这两种类型。

回答

2

除非您使用Socket,否则您将不得不使用JNI来挂接到更原始的IPC机制。

考虑到您拥有包含视频数据的内存缓冲区,您可以使用“共享内存”API从JVM中访问该内存。看看shmat的手册页。

您还需要某种信号告诉Java客户端新的视频数据可用。

1

您可能想考虑让“远程”接口在两种情况下都可以接受。

维护双前端(在这种情况下,还有一些后端)只会意味着维护的两倍和(潜在的)两倍的错误。

0

你可以看看使用JNI公开本机内存。查看直接字节缓冲区周围的JNI API。

一旦你在Java中像这样公开你的本地内存,将DirectByteBuffer中的字节复制到Java byte []数组中,它应该比你的套接字方法快得多。

1

除了使用JNI,您可以尝试JNA(Java Native Access)。通过使用它,您可以直接从Java调用您的C API,而无需编写JNI代码。请考虑准备小DLL,它定义了所有必需的方法,如打开,关闭网络摄像头设备,并获取图像作为字节数组。然后使用JNAreator从该DLL准备Java类。它工作太棒了。几年后,当我发现这个项目时,我开始使用本机代码。

你也可以考虑使用BridJ这是其他Java API的本地代码。它也像JNA一样透明,但速度更快,而且你也不需要使用JNI。

相关问题