Онлайн-трансляція ACM ICPC: Як це влаштовано



Про чемпіонат

Міжнародна олімпіада ACM ICPC – найбільший захід серед командних студентських змагань з програмування у світі. Проводиться олімпіада з 70-х років (тоді це було швидше змагання між університетами США), з кінця 90-х у ній беруть активну участь й інші країни. Університет ІТМО в 2015 році став шестиразовим переможцем ACM ICPC.

Природно, інтерес до олімпіади проявляють не тільки самі вузи-учасники, але й тисячі людей по всьому світу. І для того, щоб ACM ICPC було не «камерним» заходом для учасників та їх тренерів, існує онлайн-трансляція фіналу олімпіади, за якою можна спостерігати «наживо» і по закінченні заходу (трансляцію фіналу 2015 року можна подивитися тут). Про те, як організована трансляція, які цікаві технічні рішення використовуються в процесі її проведення, ми і розповімо сьогодні «з перших вуст» – від особи її організаторів.

Історія трансляцій ACM ICPC

У перший раз онлайн-трансляція фіналу чемпіонату світу була представлена в 2009 році в Стокгольмі. З 2009 по 2012 рік трансляцією займалася команда Центру стійких комунікацій Королівського технологічного інституту (Швеція). Їх спеціалізацією був віддалений монтаж відео, однак зйомка і передача велася традиційним відео способом: SDI-камери та відеомонтаж.



Так виглядала студія в 2011 році

Однак, ACM ICPC – змагання з програмування, і крім стандартних камер на майданчику, які дають відео для трансляції на кожному комп'ютері команди встановлена вебкамера, яка стрім відео команди протягом усього змагання. Крім того, запущений у фоні на комп'ютерах команд скрипт записує і аналогічно транслює скрінкасти кожної команди.



Студія в 2012 році – робота все ще ведеться традиційним способом

Тому коли за онлайн-трансляцію чемпіонату стала відповідати команда Університету ІТМО, було вирішено перейти від стандартних технологій відеовиробництва до більш цікавим рішенням – стрімінгу трансляції на Youtube і twitch, використанню потужних комп'ютерів і VLC/ffmpeg для обробки і монтажу відео (на противагу раніше використовувалися апаратним рішенням від Blackmagic).

Таке рішення було прийнято в першу чергу із-за того, що фінал ACM ICPC кожен рік проводиться в різних країнах, тому перевезення купленого устаткування може стати істотною проблемою для організаторів. Крім того, софт для трансляції може бути використаний і на інших змаганнях.

Схема пристрою трансляції: Етап отримання контенту

Технології та апаратне забезпечення
Система проведення змагань надає нам стріми вебкамер і екрану всіх команд, які беруть участь у змаганні, фід посилок від учасників (посилкою називається рішення задачі, відправлений на перевірку), у тому числі вердикт журі.

Для зйомки загальних видів залу використовуються дві мережеві PTZ-камери AXIS V5915. Така камера дозволяє знімати відео в дозволі 1080p і регулюється з допомогою веб-інтерфейсу. Для того, щоб живити камери, встановлені у важкодоступних місцях, ми використовуємо PoE-інжектори (це зручний спосіб подачі електроживлення на мережеві пристрої: до PoE-інжектору підключається штатний блок живлення, сам інжектор під'єднують до Ethernet-кабелю, після чого з другого перехідника можна підключити камеру, при цьому харчування буде передаватися по Ethernet-кабелю).





Крім перерахованого ми використовуємо чотири портативні відеокамери, сигнал з яких передається за допомогою чотирьох Teradek Clip, що живляться від акумуляторів SWIT (на цих акумуляторах вони можуть працювати протягом всього контесту).





На базі одного з Clip'ов ми зібрали мобільний комплекс. Він являє собою рюкзак з акумуляторами, на одній з лямок якого з допомогою липучки прикріплений Clip та GoPro. Його ми плануємо надіти на волонтера, який розносить кульки командам.



Повітряні кульки командам розносять за правильно розв'язані задачі

ICPC Analytics
Команда аналітиків постійно розвиває свій додаток Katalyzer, яке отримує на вхід не тільки лог посилок, але і регулярні бекапи з комп'ютерів учасників. Їх аналіз дозволяє зрозуміти, над яким завданням зараз працює команда (наприклад, якщо активно змінюється файл a.cpp – напевно, над завданням А). Крім того, аналітики стежать за екранами команд-лідерів, які знають, хто в команді на якій мові програмування пише, і регулярно дають оцінку всього, що відбувається.

Команда
Видеогруппа, зайнята під час онлайн-трансляції, складається з десяти відеооператорів, які позмінно забезпечують нам відео з майданчика проведення чемпіонату і флеш-зони для інтерв'ю в прямому ефірі, а також запис розборів завдань.



Зал для проведення чемпіонату

Команда аналітиків зазвичай складається з п'ятнадцяти чоловік, які (крім підготовки і запису розборів) дивляться цікаві події від автоанализатора (AutoAnalyst – додаток, розроблене спеціально для чемпіонату ACM ICPC, що відстежує список посилок, бекапи комп'ютерів і екрани учасників) і додають в лог подій цікаві новини вручну. Крім того, аналітики заздалегідь готують для кожної команди і для кожного учасника профайл, який ми показуємо при поданні команди.



Команда Пекінського університету. Кадр з трансляції чемпіонату

Команда ICPCLive складається з п'ятнадцяти осіб – директора, режисера, дизайнера, програмістів, видеоредакторов. Якщо все йде добре, під час змагання залишається тільки вибирати, екрани яких команд показувати в який момент, додавати в розклад нові відеоролики і вчасно підключати вид з найбільш цікавою камери.

Додатково: ролики медиаслужбы і видеоразборы
В онлайн-трансляції ми використовуємо заздалегідь записані відео. Вони включають в себе ролики медиаслужбы ICPCNews (ці відео далі доступні на їх youtube-каналі), інтерв'ю ключових людей, фаворитів чемпіонату і спонсорів. Більшість цих відео записують заздалегідь.

З видеоразборами завдань справа йде інакше. Умови завдань – об'єкт підвищеної секретності, тому запис видеоразборов починається одночасно з початком змагання, коли всі команди вже надійно ізольовані від навколишнього світу на майданчику. Аналітики готують, записують і разом з ICPCNews монтують розбори і передають їх в ефір, режисер приймає рішення про те, коли поставити їх в ефір.

Етап обробки контенту

Технології та апаратне забезпечення

Наш відеопотік можна розбити на дві цілком різні частини: картинку з камер і інфографіку, яка накладається зверху за допомогою стандартного хромакея. Почнемо з самого простого, а саме з камер. Для управління потоком інформації з них найбільш простим і розумним рішенням для нас виявилося зовнішнє програмне забезпечення Wirecast.

Wirecast виявився напрочуд зручний для завантаження попередньо записаних відео за допомогою API, який ми задіяли і для складання розкладу майбутніх відеороликів. При цьому варто Wirecast відносно недорого, особливо якщо порівнювати вартість з оплатою послуг підрядників під час трансляції.

Вся інфографіка для проекту також створюється in-house, силами команди. В якості мови програмування був обраний Java. При цьому найпростіше рішення в плані створення інфографіки виявилося одночасно і самим елегантним – вся графіка малюється на canvas; віджети перерисовываются кожні 1/25 секунди. Що стосується невеликих видеоблоков куті екрана, то для їх створення ми обійшлися vlcj-бібліотекою, яка є оболонкою на Java для нативного виклику функцій vlc плеєра.

Основна складність при роботі з відеопотоком полягає не в створенні тієї чи іншої його складової, а в управлінні ними. У минулому році управління велося через стандартні Java-форми, які повідомляли інфографіці інформацію по tcp. У цьому ж році ми пішли далі і написали спеціальний http-сервер, який підтримує зміни від декількох користувачів одночасно і віддає всю інформацію (що і як показувати) по tcp комп'ютера, який малює інфографіку.



Як це виглядає: відео плюс інфографіка

Вивчивши наявні фреймворки для написання http-серверів на Java, ми вибрали Vaadin. Можливо, це рішення не було оптимальним, так як в процесі роботи з фреймворком періодично виникали проблеми з потоками і мережею. Однак у підсумку нам вдалося їх вирішити і отримати розподілену систему, яка дозволяє кому завгодно (при наявності логіна і пароля) впливати на вихідну картинку.

Для бажаючих отримати аналогічний екзотичний досвід у майбутньому має сенс висвітлити невеликі технічні труднощі, з якими ми зіткнулися:

  • Потокове відео по мережі вантажиться не моментально, тому нам довелося виставити від 3 до 10 секунд очікування до показу глядачеві.
  • Інфографіку у вигляді накладення виявилося не так просто передати з достатньою кількістю кадрів у секунду через нашого бажання транслювати зображення в Full-HD. Тому для його передачі в Wirecast ми використовували не софтверное, а хардварне (при цьому досить дороге) рішення, яке просто забирає з монітора картинку по HDMI. Для домашніх рішень ми рекомендуємо позбутися анімацій появи оверлеїв, генерувати їх у меншому дозволі і використовувати для захоплення відео vlc.
  • Wirecast надзвичайно вимогливий до ресурсів, а процес кодування відео для відправки на Wowza «їсть» чимало оперативки, тому його ми винесли на ще один комп'ютер через аналогічний девайс.
Режим Split Screen
В минулому році, так само як і в цьому, у другого екрану є два режими управління. Спочатку в рамках торішнього контесту ми запустили автоматичний режим, що працює у відповідності з наступною логікою:

  • Команда могла потрапити на екран приблизно на 10 секунд (це і є та сама реакція після отримання результату), якщо здавала завдання.
  • Коли відсутні посилки, на екрані демонструвалися веб-камери перших 12 команд по колу, приблизно за 20 секунд кожна. Ці 12 команд були відібрані на початку чемпіонату як найбільш цікаві.
Протягом першої години контесту стало ясно, що даний алгоритм абсолютно не відповідає вимогам аудиторії: більшість цікавилося не першими 12 командами, при цьому всім було набагато цікавіше дивитися на код, а не спостерігати за роботою команд по веб-камері. Тому ми вирішили переключити Split Screen на ручний режим: ми самі отсматрівать коментарі на youtube, twitch і twitter, і вибирали, які ж команди показувати.

Тому в нинішньому році саме цей напрямок зазнало найбільших змін. По-перше, тепер глядач завжди бачить два відеопотоку – один з екрану і іншої з веб-камери; у більшості випадків «велике» відео буде містити код.

По-друге, в цьому році ми тестуємо автоматичну «голосовалку» за команди, яка буде працювати за наступним алгоритмом: вона відстежує в twitter повідомлення з #ICPC2016, «висмикує» перший хештег, відповідний команді на сайті myicpc і збільшує кількість голосів за обрану команду на одиницю.



Команда Університету ІТМО-2016: Адам Бардашевич, Антон Ковшаров, Андрій Станкевич (тренер) і Володимир Смикалов

Коли кількість голосів у команди досягає 5, вона додається в чергу на показ (команда ніколи не додається в чергу двічі, і якщо команда в черзі, то кількість голосів за неї не збільшується). Щоб знизити автоматичне набивання голосів, ми плануємо враховувати тільки по одному твіти від користувача в хвилину. По-третє, крім користувача автоматики, ми все рівно плануємо показувати в якісь моменти перші 12 команд.

Етап виведення вмісту в мережу

Оскільки нам потрібно було забезпечити трансляцію не тільки в інтернет, але і у внутрішню мережу на змаганні (з півтори тисячі учасників олімпіади змагаються тільки 384, решта – тренери, гості, організатори – стежать за змаганням), ми вирішили використати в якості посередника сервер на Wowza, на який приходив відеопотік з Wirecast, передавався потім клієнтам. Крім іншого, це вирішило проблему з записом відео на диск і дозволило без особливих труднощів зібрати коментаторську студію.

Коментаторських студій у цьому році планується дві: одна для англомовних коментарів, інша для російськомовних. При цьому в рамках експерименту ми вирішили зібрати їх за допомогою різного обладнання: для «англійської» студії ми закупили хороші гарнітури і аудіопульт, а «руську» студію зробимо з найдешевших підручних матеріалів. Головний сенс експерименту в тому, щоб перевірити, що дійсно важливо для забезпечення якісної трансляції, а що – ні. Надалі ми плануємо зробити більше локалізованих коментаторських студій.

Для Wowza-сервера і двох основних стримов (головного стріму з Wirecast і другого з Split Screen) ми використовуємо заряджені «під зав'язку» MSI GE 62 Apache pro. До кожного з них ми щедро додали usb 3.0 і HDMI-сплітери.

З точки зору софта, обидві студії будуть працювати однаково: на них буде запущений ffmpeg, який забирає відеопотік з Wowza, додає звук з мікрофонів і передає отриманий відеопотік з коментарями назад в Wowza. Наприклад, нижче наведена рядок, яка додає до готового стриму аудіокоментарі:

ffmpeg -re -i "rtmp://%ip%:1935/icpclive/main" -f dshow -audio i="Microphone" -filter_complex "[0:a][1:a]amerge,pan=stereo:c0<c0+2*c2:c1<c1+2*c3[out]" -map 0:v -map "[out]" -vcodec copy -acodec aac -ab 100000 -ac 2 -f flv rtmp://%ip%:1935/icpclive/comments/ukr


Що довелося змінити

У 2015 році, коли наша команда розробки ICPCLive перший раз робила онлайн-трансляцію, робота з мобільними камерами і остаточний монтаж був реалізований руками підрядників. Виявилося, що всього один додатковий вузол між режисером і монтажем відео істотно погіршує якість каналу. Для управління звуком у 2015 використовувалося додаток на iMac – як з'ясувалося, натискати мишею для вибору каналу звуку виявилося незручно і дуже повільно, тому в цьому році ми використовуємо аудиопульты.

Спочатку в якості HDMI2WiFi-трансмітерів ми використовували не Teradek Clip, а їх «акумуляторних братів» Teradek Vidiu, але зіткнулися з цікавою особливістю. При стриминге відео в локальній мережі можна використовувати один з безлічі різних протоколів передачі даних. Комп'ютер, використовуючи, наприклад, команду ffmpeg може «підняти» на собі http-стрім, який буде доступний комп'ютерів локальної мережі.

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

Як рестримера відмінно вміє виступати використовувана нами Wowza, однак виявилося, що передача RTMP-потоку через Wowza створює затримку в приблизно десять секунд, на яку ми не готові були піти, а крім того, два таких потоку навантажують комп'ютер-монстр з Wowza-сервером до 70% CPU, що не залишало такого варіанту жодних шансів на виживання.

ICPCLive і новий формат трансляцій

Зазвичай прямий ефір заходів складається з кілометрів SDI-проводів та апаратних рішень, що дозволяють комутувати сигнал, робити вбудовування картинки на картинку і правильним чином мікшувати звук. Це робить послуги з онлайн-трансляції дуже дорогими, доступними фактично тільки одиницям компаній у кожній країні, у яких є відповідне обладнання.

Використання Wi-Fi і комп'ютерів для всього ланцюжка трансляції робить її ультрапортативної – ми можемо зазирнути з камерою туди, куди не дотягувалися дроти, автоматично показувати найцікавіше по ходу змагання, за хештегам в твіттері демонструвати екрани і вебкамери цікавих глядачам команд і робити спеціальні трансляції для різних мов.

Код нашого чудового проекту лежить тут.

Є питання? Хочете допомогти? Пишіть нам icpc-live-team@googlegroups.com!

Вранці 19 травня підключайтеся до прямої трансляції фіналу студентського командного чемпіонату з програмування ACM ICPC 2016 на сайті ICPCLive, підписуйтесь на канали на youtube і twitch (англійська трансляція тут, російська – тут другий екран – тут – обіцяємо спонтанні включення і найцікавіші подробиці.

І, зрозуміло, вболіваємо за Університет ІТМО!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.