Самый эффективный способ переместить изображение из программы на C на Java и показать на экране? - PullRequest
1 голос
/ 10 ноября 2008

Фон

Я снимаю видео, используя спецификацию video4linux 2. Он записывается с помощью программы на C в режиме реального времени. У меня также есть интерфейс Java, который может работать как локально, так и удаленно. Удаленная сторона была простой, я просто сжимал изображения в JPEG и отправлял их через сервер mini-http клиенту, который распаковывал их и отображал их на экране.

Когда мы работаем локально, я бы хотел, чтобы IPC каким-то образом подключился напрямую к этой памяти и получил доступ к изображениям из Java. Затем перетащите их на экран, используя как можно меньше ресурсов процессора. Это система типа «наблюдение», поэтому я могу одновременно запускать 8-16 камер.

Вопрос

Каков наиболее эффективный способ перемещения данных изображения (YUV420P) из буфера m4 v4l2 в мое приложение Java для отображения на экране? Пожалуйста, покажите код или укажите мне некоторые API / спецификации, если таковые имеются.

Ответ

В интересах экономии времени я решил использовать простые сокеты и отправлять данные в RGB. Мне удалось значительно повысить производительность, когда клиент Java работает на той же машине. Я все еще отправляю файлы JPEG по сети, если клиент работает удаленно. Далее мне нужно найти оптимизированный JPEG-декодер.

Кстати, это не 2 клиента, просто мой виджет CameraStream читает и анализирует оба типа.

Ответы [ 4 ]

2 голосов
/ 10 ноября 2008

Если вы не используете Socket, вам придется использовать JNI, чтобы подключиться к более примитивному механизму IPC.

Учитывая, что у вас есть буфер памяти, содержащий видеоданные, вы можете использовать API-интерфейсы «разделяемой памяти» для получения доступа к этой памяти из вашей JVM. Посмотрите справочную страницу для shmat.

Вам также понадобится какой-то сигнал, чтобы сообщить клиенту Java о наличии новых видеоданных.

1 голос
/ 05 декабря 2012

Вместо использования JNI вы можете попробовать JNA (собственный доступ к Java). Используя его, вы можете вызывать C API напрямую из Java без необходимости писать код JNI. Пожалуйста, подумайте о подготовке небольшой библиотеки DLL, которая определяет все необходимые методы, такие как открытие, закрытие устройства веб-камеры и получение изображения в виде байтового массива. Затем используйте JNAreator для подготовки классов Java из этой библиотеки DLL. Это работает фантастически. Я снова начал играть с нативным кодом через несколько лет, когда обнаружил этот проект.

Вы также можете рассмотреть возможность использования BridJ , который является другим Java API для нативного кода. Он также прозрачен, как JNA, но намного быстрее, и вам не нужно использовать JNI тоже.

1 голос
/ 10 ноября 2008

Возможно, вам стоит подумать о том, чтобы заставить «удаленный» интерфейс работать приемлемо для обеих ситуаций.

Поддержание двойных внешних интерфейсов (а в данном случае и некоторых внутренних) также будет означать в два раза больше обслуживания и в два раза больше (потенциальных) ошибок.

0 голосов
/ 12 декабря 2009

Вы можете изучить использование JNI для демонстрации собственной памяти. См. API-интерфейсы JNI вокруг прямых байтовых буферов.

Как только вы представите свою собственную память таким образом в Java, скопируйте байты из DirectByteBuffer в массивы Java byte [], и это должно быть намного быстрее, чем ваш подход к сокетам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...