Снимок экрана Java с использованием робота и потоковой передачи сжатого видео (JCodec) через сокеты
Мне нужно приложение Java (рабочий стол - Windows & Mac), которое должно отправлять видео с рабочего стола другим пользователям через сокеты (WebSockets, потому что клиенты используют браузер).
На данный момент мне удалось сделать:
- Получить скриншот, используя
Robot.getImageWritersByFormatName
(не так быстро, но, насколько я знаю, другого кроссплатформенного решения не существует) - Мне удалось настроить сокет связи
java socket client -> screenshare/socket server -> client(browser)
- Попытался отправить сжатые JPEG-изображения, а затем отобразить их в браузере, в локальной сети это было приемлемо, но когда дело доходит до скорости, это очень очень медленно (3/4fps и поток уже>350kbps)
- Выяснилось, что мне нужно сжатие видео (не все еще изображения, как JPEG), ключевые кадры, кадры и т. Д. У меня нет большого опыта с кодированием / декодированием видео
- Нашел библиотеку JCodec (мне кажется, очень хорошая библиотека с чистыми кодеками для Java, отличная работа, но нет документации)
- Благодаря примеру кода, мне удалось закодировать последовательность изображений BufferedImage в h264/mp4, но только чтобы сохранить ее в файл
Как я себе представлял, если я могу использовать ByteBufferSeekableByteChannel вместо FileChannelWrapper (оба реализуют SeekableByteChannel) и хранить данные в памяти с помощью ByteBuffer, то я могу вызвать channel.read(someOtherByteBuffer)
в цикле и отправить байтовый массив через сокет, но я получаю массив, полный нулей.
Кто-нибудь знает, как заставить это работать? Любой другой совет или, возможно, какая-то другая идея, как сделать это приложение, приветствуются.