Снимок экрана 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) в цикле и отправить байтовый массив через сокет, но я получаю массив, полный нулей.

Кто-нибудь знает, как заставить это работать? Любой другой совет или, возможно, какая-то другая идея, как сделать это приложение, приветствуются.

0 ответов

Другие вопросы по тегам