C # лучшее сжатие для приложения удаленного рабочего стола - PullRequest
3 голосов
/ 04 ноября 2010

Я нахожусь в процессе создания TCP приложения для удаленного рабочего стола.(Что-то вроде Team Viewer или VNC) серверное приложение будет

1. run on a PC listening for multiple clients on one Thread
2. and on another thread it will record the desktop every second
3. and it will broadcast the desktop for each connected client.

Мне нужно, чтобы это приложение могло работать на соединениях с загрузкой 12KBps и DSL-соединением загрузки 50KBps (клиент и сервер).

так что ... мне нужно уменьшить размер данных / изображений, которые я отправляю в секунду.

я попытался уменьшить их, выполнив следующие действия.

I. first i send a Bitmap frame of the desktop and each other time i send only the difference of the previously sent frame.

II. the second way i tried was, each time i send a JPEG frame.

я не смоготправить кадр JPEG, а затем каждый раз при отправке разницы ранее отправленного кадра JPEG.

Я пытался использовать lzma сжатие (7zip SDK) для передачи разницы в битовой карте.

Но мне не удалось сократить данные до 12 КБ / с.максимум, которого я смог достичь, был около 50 Кбит / с.

Может кто-нибудь посоветовать мне алгоритм / процедуру для этого?

1 Ответ

9 голосов
/ 04 ноября 2010

Что вы хотите сделать, это сделать то, что делают форматы сжатия изображений, но в произвольном порядке (отправляйте только изменения, а не все изображение снова и снова). Вот что я хотел бы сделать, в два этапа (этап 1: сделать это, доказать, что это работает, этап 2: оптимизировать)

Подтверждение концепции этапа

1) Захват изображения на экране в растровом формате

2) Разделить изображение на блоки смежных байтов. Вам нужно поиграть, чтобы определить оптимальный размер блока; он будет зависеть от скорости восходящей / нисходящей линии связи.

3) Получите короткий хеш (crc32, может быть, md5, поэкспериментируйте с этим) для каждого блока

4) Сожмите (не забудьте сделать это!) И перенесите каждый измененный блок (Если хеш изменился, блок изменился и его необходимо перенести). Соедините изображение на приемном конце, чтобы отобразить его.

5) Использовать UDP-пакеты для передачи данных.

Фаза оптимизации

Вот что вы можете сделать, чтобы оптимизировать скорость:

1) Сбор статистики и скорости передачи жесткого кода в зависимости от размера кадра и метода хеширования для оптимальной скорости передачи

2) Сделать саморегулирующийся механизм для # 1

3) Изображения лучше сжимаются в квадратных областях, а не в смежных байтных блоках, как я объяснил в # 2 первого этапа выше. Измените свой алгоритм так, чтобы вы получали визуальную квадратную область, а не последовательные блоки линий. Этот квадратный метод - то, как люди сжимают изображения и видео.

4) Поиграйтесь с алгоритмом сжатия. Это даст вам множество переменных для игры (загрузка ЦП в зависимости от скорости доступа в Интернет, выбор алгоритма сжатия и частота обновления экрана)

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

НТН

РЕДАКТИРОВАТЬ: Еще одна вещь, с которой вы можете поэкспериментировать: после захвата растрового изображения на экране, уменьшите количество цветов в нем. Например, вы можете сохранить половину размера изображения, если перейдете с глубины цвета 32 бита на 16 бит.

...