xfce4-terminal и rm -Rf

Однажды пришло ко мне начальство и попросило помочь коллегам из одного подмосковного конструкторского бюро. Камеру они не смогли осилить… Специфичную такую камеру. Меня только на работе просили не писать, что это за камера была. И где её применяют, писать тоже нельзя. Можно написать, что камера имеет сервоприводы, несколько режимов работы и лазерный дальномер. С камерой ещё шли два монитора, на которые она выводила изображение. Проблема оказалась в том, что ставить их (мониторы эти) некуда, — видео надо захватить и вывести на ПК командира. А представители завода изготовителя камеры ничего дельного сказать не смогли, отморозившись привычным «под Windows работает, ничего не знаем про этот ваш Linux». Знакомо, не правда ли?

Что это, и из чего оно состоит?

Устройство состоит из комбинированного оптического модуля, содержащего обзорную (дневную) камеру, тепловизор и лазерный дальномер. Устройство имеет приводы наклона по вертикали, а так же привод поворота, обеспечивающий обзор в 360°. Мониторы, как и устройство, выдающее сигналы на поворот, цепляются к модулю управления. Это то, что предстало перед взором при первом знакомстве.

tcpdump быстро позволил узнать, что внутри модуля коммутации имеется неуправляемый свитч. Адрес камеры — 172.16.0.1/24, адреса устройств вывода изображений — из сети 172.16.0.0/24, MTU равен 4000. Сходу было отмечено, что в момент включения камеры, на всех портах свитча (того, что внутри модуля коммутации) появляется мультикаст RTP для 239.192.1.0:50000 (дешёвый неуправляемый свитч без IGMP snooping). Последующее изучение выявило, что внутри RTP отправляется RAW 1024×768 RGB24 (стандартный 8+8+8 RGB gstreamer’а), 25 кадров в секунду.

Что это, почему это так сделано?

Судя по всему, внутри модуля камеры стоит одноплатный компьютер с гигабитным портом, который включается в модуль коммутации, содержащий в себе некий гигабитный свитч. Такой среды передачи хватило бы только на один поток, для одного клиента. А мониторов может быть много. Соответственно, если камера попытается передать видео изображение более чем одному монитору, то ей просто не хватит полосы пропускания интерфейсов на ней самой и свитче. И производительности свитча, возможно, тоже не хватит. И именно поэтому они (разработчики) применили отправку на групповой адрес, тем самым дав всем клиентам (мониторам) возможность получить этот самый один поток. Вот только jumbo frame странного размера позволяет думать, что разработчики в последний момент столкнулись с проблемами в канальном уровне.

И как мне это всё захватить GStreamer’ом?

Просто! Для начала нужен какой-либо компьютер с установленным дистрибутивом GNU/Linux и GStreamer 1.0. Компьютер должен иметь интерфейс GbE интерфейс, разумеется. В ОС требуется:

  1. настроить сетевой интерфейс, назначив на него адрес 172.16.0.[2-254]/24 (родные мониторы имеют адреса 172.16.0.16/24 и 172.16.0.17/24) и увеличив MTU до 4000 байт;
  2. увеличить размер буфера операционной системы, отведённый для подключений UDP хотя бы до 8МБ, добавив в sysctl.conf следующее:
    net.core.rmem_max=8388608
    net.core.wmem_max=8388608

После данной подготовки можно запускать GStreamer:

gst-launch-1.0 -v udpsrc multicast-iface=eth0 address=239.192.1.0 port=50000 buffer-size=4194304 caps='application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)RGB, depth=(string)8, width=(string)1024, height=(string)768, payload=(int)96, a-framerate=(string)25' ! queue ! rtpvrawdepay ! queue ! videoconvert ! xvimagesink sync=false

Обязательно обратите внимание, что необходимо поднять до 4МБ размер буфера udpsrc во избежании повреждения RTP кадров!

Как мне сгенерировать схожий поток, не имея на руках модуль камеры?

Требования к передатчику тестового сигнала аналогичны требованиям к приёмнику из прошлого пункта, включая настройку ОС. Стоит отметить, что придётся назначить определённый сетевой адрес — 172.16.0.1/24. Так же придётся соединить компьютер-отправитель и компьютер-получатель через гигабитный свитч (можно дешёвый и ооочень не управляемый). Строка запуска GStreamer’а будет выгладить так:

gst-launch-1.0 -v videotestsrc pattern=ball ! video/x-raw, format=RGB, width=1024, height=768, framerate=25/1 ! rtpvrawpay mtu=4000 ! queue ! udpsink host=239.192.1.0 port=50000 multicast-iface=eth0

Где мне взять GStreamer 1.0 под Astra Linux 1.4 SE?

Всё украд написано до вас — H264 в Astra Linux 1.4 SE через GStreamer1.0 (и как его собрать)

Послесловие

Это был приятный опыт по отгадыванию содержимого чёрного ящика. Азарту добавляло то, что производитель модуля камеры рекомендует использовать с ней определённые мониторы. Военные тоже давят, чтобы использовали именно вот их. А так быть не должно. Очень жаль, что из-за каких-то там предубеждений меня попросили не раскрывать название устройства… Люди должны знать своих «героев»! Могла быть отличная статья в догонку к Армейский Ынтерпрайз: об месте МСВС в этом мире.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

÷ 3 = 3