Захват и передача экрана по сети

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

Программные средства

Самый популярный кросс-платформенный программный продукт, который существует на настоящий момент который может захватывать, кодировать и передавать видео с экрана  - это мультимедиа комбайн VLC [http://www.videolan.org/]. 

C помощью VLC можно с легкостью открыть экран как устройство захвата и приступить к захвату, кодировке и передаче видео. В качестве интерфейса управления использовать консоль, telnet, оконный и Web-интерфейс. В окне настроек можно контролировать параметры командной строки, что позволяет упростить процесс настройки.

В ходе проведенных экспериментов выяснилось что в случае захвата, кодирования и передачи видеосигнала по сети с помощью программных средств возникают колоссальные задержки, которые возникают в следствии загрузки центрального процессора. 

Захват видео

Проведем простой эксперимент, захватим экран с включенным секундомером с помощью VLC и подсчитаем разницу в значениях секундомера в окне секундомера и в окне захвата полученное значение будет задержкой (латентностью) вызванной аналого-цифровым преобразованием (АЦП). Контроль осуществим с помощью цифровой USB Web-камеры (Gembird) и с помощью аналоговой видеокамеры (Sony Handycam). Для того что-бы минимизировать влияние процессора снимки экрана будем делать на мобильный телефон, а не через инструментарий операционной системы.

Захват с экрана через программу VLC выполняется командой

$ cvlc screen:/// :screen-caching=40 --screen-fps="20" --screen-caing="1"

Захват с камер осуществляется через xawtv, с помощью следующих команд:

Для аналоговой камеры подключенной к TV-тюнеру:

$ xawtv -c /dev/video0

Для Web-камеры:

$ xawtv -c /dev/video1

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

  • ~ 300 мс. при захвате экрана через программу VLC

  • ~ 100 мс. при захвате на аналоговую видеокамеру

  • < 100 мс. при захвате на Web-камеру.

Вывод: 300 мс. при захвате через VLC - слишком много. Те же камеры показали задержку в три раза меньше это говорит о том что программное решение далеко от возможности использования в случаях когда осуществляется итерактивность и задержка имеет значительную роль (например в играх). В случае просмотра не интерактивного содержимого, например видео и 3D-демонстраций возможно использование VLC.

Передача видео

Попробуем передать видео с Web-камеры компьютера на другой компьютер по сети с выполнением кодирования. Так как аудио поток планируется передавать через SPICE-соединение, в ходе эксперимента кодировать и предавать звук не будем. Видео с экрана передавать не будем, а будем использовать видео с web-камеры так как компьютеры находятся на разных рабочих местах. Для определения задежки будем использовать отсчет секунд с момента движения до момента отображения этого движения. 

В качестве протокола передачи выберем UDP так как данный протокол не требует проверки целостности пакетов, а следовательно обладает более высокой скоростью чем протоколы на базе TCP.

При использовании протокола UDP компьютер-источник отправляет пакеты на указаный UDP-порт компьютера-получателя. Видеоданные в этом случае упаковываются в потоковый транспортный контейнер (TS) и видео шифруются кодеками поддерживающими этот контерйнер. Данный цифровой контейнер широко используется в сетях цифрового телевиденья, видео сжимается протоколами MPEG2 и MPEG4. 

В целях проведения эксперимента использовлись команды вида:
$ cvlc v4l2:///dev/video1 --sout "#transcode{vcodec=<кодек>,vb=100,fps=20, scale=0.5}:std{access=udp{ttl=1},mux=ts,dst=<удаленный_адрес>:<UDP_порт>}"

В результате проверки кодеков, были получены следующие результаты:

Кодек(код в VLC)
Задержка (сек)
H.264 (h264)
5
MPEG (mp1v)
2
MPEG2 (mp2v)
3
Windows Media (WMV1)
2
MJPEG (MJPG)
2

Более подробный список кодеков VLC на станице: http://wiki.videolan.org/Codec

Вывод: Задержки по несколько секунд - это перебор по причине того что комфортная задержка в обычной сетевой игре часто не превышает 150 милисекунд. Сервис onLive возможно не смог-бы предлагать доступ к играм в облаке с такими задержками. Скорей всего для передачи видео с экрана используются не программные а аппаратные средства.

Аппаратные средства

Как вы знаете существуют так называемые устройства видеозахвата, которые самостоятельно осуществляют захват и кодирование видеосигнала с аналоговых источников (например: телевизор, RCA (тюльпаны)), также существуют устройства захвата с цифровых устройств так называемые фрейм-граберы, которые подключаются вместо монитора к видеоисточнику.

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

Фрейм-граберы

 

Epiphan

Рассмотрим модельный рад компании «Epiphan»:

Цены на устройства захвата начинаются от 300 за VGA-грабер c USB интерфейсом начального уровня и могут достигать 2000 за VGA-грабер с USB-интерфейсом поддерживающий высокое количество кадров.

Сравним цены на бюджетное решение VGA2USB и профессиональные решения Epiphan VGA2USB Pro и Epiphan DVI2PCI-e в Канаде и России: 

 
Epiphan VGA2USB
Epiphan VGA2USB Pro
Epiphan dvi2pci-e
Канада
300$
1000$
1000$
Россия
450$
3000$
Цены не указаны

Как видим цены на российском сайте в полтора раза выше, чем на официальном сайте.

Продукция компании Epiphan совместима с Linux что позволяет сэкономить на лицензиях на Windows.

 

AverMedia

Компания AverMedia также предлагает линейку фреймграберов с поддержкой инструментов разработки (SDK) [http://solutions.avermedia.com/ru/products/capture-cards ], а также решения для частных пользователей [http://avermedia.com/product/ProductList.aspx?IID=7].

Решения от AverMedia стоят значительно дешевле чем решения от Epiphan, но не имеют официальной поддержки Linux.

Броадкастеры

В настоящее время броадкастеры поддерживающие FullHD разрешение имеются только у Epiphan:

Цены на трансляторы начитаются от 1600 за VGA транслятор и могут привышать 10000 в случае с VGA Grid.

Вывод: цены на аппаратное решение для захвата видео с выхода видеокарты очень высоки, однако позволяют насладится качественной удаленной работой с виртуальной машиной при условии интеграции со SPICE-клиентом.

Как вариант выход VGA можно преобразовать в RCA (тюльпан) и за счет более дешевых устройств захвата транслировать сигнал по сети экран проброшеной видео карты , но к сожалению такое решение неизбежно повлияет на АЦП задержку так как преобразование будет выполнятся два раза.