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

Зачем вообще нужна минимальная задержка?
Как можно просто и наглядно замерять задержку при трансляции видеосигнала?
Какие элементы видеотракта влияют на увеличение задержки?



Наш топовый результат — FullHD сигнал пролетел до сервера и обратно менее чем за полсекунды.

Интересно? Тогда читайте дальше.

Итак, зачем вообще нужна минимальная задержка?

Моя компания занимается организацией онлайн-видеотрансляций, и в последнее время мы очень активно развиваем тему телемедицины — устраиваем трансляции хирургических мастер-классов, и организовываем почти что полноценные телемосты между операционными и конференц-залами: из оперблока транслируется картинка с внешних камер и медицинских аппаратов (эндоскопов, лапароскопов, роботов-хирургов), зрители сидят в комфортных креслах в другом конце города, смотрят на здоровом экране FullHD-картинку, и по мере необходимости задают вопросы врачам. При таком сценарии заказчикам оказался очень важен комфорт в общении — все привыкли к телефону и скайпу, и даже 3-4-ёх секундная задержка существенно усложняет взаимодействие зала и операционной, и очень отвлекает хирургов, которые делают самые настоящие операции.

Вот типовые условия, в которых нам приходится работать:

— сигнал 720p или 1080i, чаще всего в формате SDI, получаемый или напрямую с камеры или медицинской стойки, или с программного выхода видеомикшера;
— чаще всего достаточно медленный интернет, или полное его отсутствие — немалую часть проектов мы делаем через сети 4G;
— отсутствие внешних IP;
— высокодинамичная и крайне детализированная картинка, необходимость сохранить адекватную цветопередачу;

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

Главные проблемы Скайпа — невозможность ручной настройки параметров качества видео, и свой «слишком умный» алгоритм кодирования, который может самостоятельно начать ухудшать качество картинки, если вдруг решит что ему не хватает ширины интернет-канала. Ну и завести в Скайп картинку с SDI-выхода видеомикшера это отдельное колдунство, не всякому маглу подвластное…

С ВКС тоже оказалось не всё гладко — существенные требования к пропускной способности канала, наличие внешних IP, отсутствие профессиональных видео и аудиовходов, совершенно конский ценник как на покупку, так и на аренду, и при этом «никакое» качество. Да, возможно, ВКС позволяют красиво показать дядь и тёть в костюмах, сидящих в модно отделанном митинг-руме, но когда на одном статусном медмероприятии наши конкуренты запустили трансляцию с лапароскопической стойки через ВКС, картинка пришла ужасающая — система просто не могла быстро кодировать весьма динамичный видеосигнал с высокой детализацией, и вместо FullHD на экранах был совершенно инфернальный калейдоскоп, больше всего напоминающий трейлер к фильму «Пиксели».

Качество картинки на наших массовых трансляциях, проводимых через собственные сервера на базе Wowza, было намного лучше чем и на Скайпе и на ВКС, плюс у нас накопился приличный парк кодировщиков — мощных компактных компьютеров с SDI-платами видеозахвата, что позволяло без нервов делать несколько проектов одновременно.

Я поставил перед своими инженерами задачу «выжать» из Wowza максимум возможной скорости, и сразу же встал вопрос — как и чем измерять задержку? Скажу честно — думали долго, и потому еще более забавным выглядит результат, в очередной раз подтверждая что всё гениальное — просто.



Мы взяли за основу классический «обратный отсчёт», используемый (вернее, давно уже не используемый) в кино- телепроизводстве, сделав его чуть более информативным и детализированным.

Процедура измерения до смешного проста: включаем в плеере ролик, прогоняем через весь видеотракт, ставим рядом экраны передающего и принимающего компьютера, банально фотографируем на телефон оба экрана, вычитаем из большей цифры меньшую, и получаем длительность задержки с точностью до кадра. Соответственно, если точки передачи и приёма удалены, то можно отправить сигнал с площадки А, принять его на площадке Б, сразу отправить его обратно на площадку А, аналогично сфотографировать, и полученный результат поделить на два. Крутящийся таймкод и кандыбающийся туда-сюда красный квадрат позволяют наглядно мониторить возможные косячки передачи видеопотока типа «залипов» и «подрывов» картинки.

Используя этот нехитрый инструмент мы провели тотальную ревизию своего видеотракта, поколдовали с настройками сервера, и буквально по миллисекундам выжали все задержки, получив весьма недурственный результат — при трансляции через «выделенку» мы получали скорость пролёта FullHD видео с битрейтом 4-5 Мбит/сек в 11-16 кадров (примерно полсекунды). При трансляции через сети 4G и при передаче на большие расстояния (например, тестили Санкт-Петербург — Астана) задержка возрастала ещё примерно на полсекунды. Здесь, конечно, уже начинает сказываться сложная маршрутизация между точками передачи и приёма.

Нюансы «тюнинга» вещательного сервера я по понятным причинам раскрывать не буду, но хочу обратить внимание на немаловажный нюанс — зачастую ощутимые задержки дают «железные» элементы видеотракта, о которых при подготовке проекта мало кто думает. Например, делаем телемост с конференц-залом в отеле, где вся коммутация по проекторам сделана на VGA, а у вас весь приёмный тракт на SDI или HDMI — можете быть уверены, что микшер и конвертация в VGA вам еще минимум полсекунды добавят. Допотопный проектор подключеный по «композиту»? Секунда. В точке передачи поставили дешевенькую камеру с HDMI выходом, и скотчем прикрутили к ней конвертер SDI-HDMI? Потеряли три кадра. Посчитайте сколько у вас в тракте таких конвертеров, сплиттеров и прочих железяк, и получите очень внушительные цифры, нередко сводящие на нет все усилия инженеров трансляции. Вывод простой — оптимизируйте тракт, убирая все лишние преобразования сигнала.

А для тестирования можете смело использовать наш ролик, его можно свободно скачать по этой ссылке.

P.S. Для любителей простеньких лабиринтов — блок-схема коммутации с одного из наших медицинских проектов.

Комментарии (14)


  1. affka
    20.09.2015 17:59
    +12

    Ну вы конечно молодцы, сократили задержку — похвастались. А нам то что с вашей статьи? Технических подробностей и секретов вы не хотите рассказывать, кроме того, что используется wowza. Это не совсем формат хабра.


    1. gurzillla
      21.09.2015 08:45
      +1

      Статья всё же называется «Мониторинг задержки при проведении трансляций», а не «Настройка Wowza Streaming Engine на минимальную задержку». Я согласен (и отметил это в тексте), что описанный способ прост и с виду наивен, но он работает. И за годы работы я ничего похожего ни у кого не видел, и это создавало ряд трудностей. На вопрос «Какая у вас в тракте задержка?» могли ответить что угодно — «Ну, с полсекунды, наверное...», «Да вообще моментально всё пролетает!» и никогда никто не говорил конкретных цифр.
      Про настройку Wowza тоже напишем, если будет хоть какой-то интерес к данной теме.


      1. evg_krsk
        21.09.2015 09:45
        +1

        Я так понял, что описанный метод измерения задержки — для пуско-наладочных работ, точнее, для живого человека. А во время проведения мероприятий, что, тоже живой человек постоянно мониторит обратный поток (копию прямого потока)? Или же есть какая-то мониторилка, которая все данные собирает и хранит? Более интересно, как в машино-читаемом виде задержку в одну сторону мониторить.


        1. gurzillla
          21.09.2015 10:44

          Да, так можно измерять задержку только на подготовительной фазе. Про контроль задержки в реальном времени, так чтобы эта «измерялка» еще не мешала приёму-передаче видеопотока я не слышал, попробуем изобрести свою.


          1. evg_krsk
            21.09.2015 11:15

            Поделитесь, если будет чем. Интересно.


            1. gurzillla
              21.09.2015 11:17
              +1

              Обязательно.


          1. Alexeyslav
            22.09.2015 10:05

            Зачем изобретать? в 0-ю видеостроку внедрить двоичный счетчик… или использовать для этих целей телетекст, там постоянно идет «сканирование» страниц покадрово со счетчиком. Если задать модулю генерацию страниц из всего диапазона можно запросто вычислить задержку со скоростью кадров, а если использовать телетекст штатно, можно определять задержку по 100-й странице но результаты будут раз в минуту-другую. Причем это можно железно автоматизировать и на светодиодном индикаторе сразу показывать задержку в сотых долях секунды.


  1. amarao
    20.09.2015 19:49
    +2

    В упор не понял, где в конверторе VGA->HDMI такие конские задержки в сотни и тысячи милисекунд. Я такой юзал одно время для подключения cintiq'а (для рисования). Поверьте мне, при рисовании каждый кадр лага глаза режет — а тут, ничего было, нормально.


    1. gurzillla
      21.09.2015 08:52

      Конвертер-конвертору рознь. Почему SDI-HDMI железка от AJA стоит 500$, от BMD 300$, а китайский Lenkeng 50$? Вот когда взялись анализировать задержки по каждому устройству, с интересом заметили, что в одном сигнал конвертируется за 1 кадр, а в другом за 3 кадра. Плюс, я писал в конвертацию из цифры в VGA, а не VGA->HDMI, как в вашем примере. Допускаю, что ЦАП и АЦП могут требовать разного времени обработки.
      Но на самом деле, задержки там и правда «конские». Обратите внимание на любом концерте или массовом мероприятии, с какой задержкой выводится картинка на экранах за сценой.


      1. Alexeyslav
        21.09.2015 10:28

        ЦАП и АЦП вообще работают мгновенно. А вот мост их соединяющий… задержка появляется там где нет возможности обработки сигнала на лету — например нельзя выдать результат немедленно приняв только первый байт. Но вообще видеосигнал к такой категории не относится и его можно конвертировать теоретически с задержкой в длительность одной строки. Но для этого нужна параллельная обработка, дорогие ПЛИСы… для экономии делают проще — сначала сохраняют в буфер полностью кадр, а потом этот буфер выводят на другой интерфейс. Кадр к этому времени доступен целиком, задача по выводу сильно упрощается, может даже за счет готовых решений. Но имеем задержку уже как минимум в один кадр.
        Иногда размер буфера не один кадр а десяток-другой, чтобы предотвратить возможные выпадения кадров по независящим от конвертора причинам(сбилась синхронизация кадровая из-за помех и т.д.) и при несовпадении частоты кадров на входе и выходе в результате задержка еще больше.


      1. amarao
        21.09.2015 18:17

        Даже если у нас три кадра, то это всего 150мс задержки. Откуда тут 1с?


        1. gurzillla
          22.09.2015 08:13

          В любом мало-мальски серьёзном видеотракте сигнал проходит сильно больше одного устройства. Задержки есть и при формировании сигнала в камере, и при обработке его в видеомикшере, при конвертации в потоковое видео и так далее, пока картинка не дойдёт до экрана. Какие-то сложные истории, типа контроллеров светодиодных экранов или Watchout-станций могут увеличить задержку тотально, до нескольких секунд.


  1. mafet
    20.09.2015 23:22
    +3

    Только мегафон резервировать йотой — это забавно, с учётом того, что у них одни и те же вышки.


    1. gurzillla
      21.09.2015 09:02

      Я вам по большому секрету скажу — чаще Йоту резервируем Мегафоном. Хотя вышки одни и те же, при длительном аплоаде с большим битрейтом Йота ведёт себя намного стабильнее. Плюс у Йоты полный безлимит, а у Мегафона даже на дорогих тарифах есть фиксированный объем трафика, который, бывало, внезапно заканчивался… Главный минус Йоты — у них зарезаны скорости, больше 20-22 Мбит/сек входящей и 7-8 исходящей я не видел даже в очень хороших условиях приёма. Мегафон же может и 60-80 входящей и 20-30 исходящей показать, но, как уже сказал, скорость может очень сильно «плавать».
      Ну и вдогонку — никто не мешает основной канал и резервный настроить на разные вышки. Поскольку мы используем направленные антенны, это не является особой сложностью.