Как мы делали студию для записи онлайн-курсов
Если вкратце, то Stepic – это платформа, где каждый пользователь может создать и разместить свой собственный онлайн-курс. В прошлом году Стэпик использовался в курсе Bioinformatics Algorithms на Coursera как движок для проверки задач на программирование и анализ данных.
Через какое-то время мы поняли, что стоит посодействовать развитию онлайн-образования и в России. Что для этого надо? Хорошие преподаватели и хорошая студия, где можно записывать видео. Поскольку мы любим программировать, то и начать решили с курсов, так или иначе связанных с программированием, это алгоритмы и структуры данных, операционные системы и язык С++ от преподавателей Computer Science Center.
А еще через какое-то время мы поняли, что чем больше будет хороших студий для записи, тем лучше же для всех нас и образования в целом. Поэтому мы решили рассказать, показать и выложить в опенсорс все те небольшие наработки, которые на данный момент есть в Stepic по части видео-курсов и их производству.
Студия и оборудование
На этой схеме изображен автоматизированный процесс записи видео-лекций, к которому мы пришли:
Мы решили не изобретать велосипед, а посмотреть, как оборудованы подобные проекты за границей. Отправной точкой послужила студия в швейцарском EPFL, где зимой проходила конференция EMOOCs 2014. Видео про студию в EPFL можно посмотреть тут.
Был составлен список необходимого оборудования (указаны приблизительные цены в России):
- 2 стойки под фон (3’000 руб. за штуку)
- 4 стойки под 4 источника света (1’500 руб. за штуку)
- 2 источника FalconEyes с 5 энергосберегающими лампами холодного света на засвет фона (5’500 руб. за штуку)
- 2 источника с лампами холодного света для освещения лектора (DFL-С556) (11’000 руб. за штуку)
- Белый и зелёный фон (1’500 руб. за штуку)
- Видеокамера Canon XA25 (90’000 руб.)
- Штатив под камеру Libec TH-950DV (10’000 руб.)
- Микрофон Audio-Technica AT2031 (8’000 руб.), втыкается в камеру
- Стойка под микрофон Samson MB1 Mini Boom Stand (2’500 руб.)
- Крепление под микрофон AT8410a Microphone Shock Mount (3’500 руб.)
- Wacom Cintiq 24HD Interactive Pen Display DTK-2400 (120’000 руб.) – монитор, на котором можно рисовать от руки по слайдам
- Apple Mac mini: i5, 2.5HGz (Late 2012) (~25’000 руб.) – компьютер преподавателя, к которому подключён монитором Wacom
- PC (Server): i7, 3 TB HDD, 16 GB RAM, Win (~25’000 руб.) – компьютер, на котором запущен сервер и куда стекаются видеопотоки
- AJA ROI (35’000 руб.)
- BlackMagic DeckLink Duo (18’000 руб.)
Итого, приблизительно: 385 тысяч рублей.
Думаю, выбор всех пунктов, за исключением трёх, не вызывает вопросов. А вот про то, почему мы выбрали этот кэнон и зачем же нужны AJA ROI и DeckLink, я бы хотел рассказать ниже.
AJA ROI и DeckLink Duo
В нашей студии (как и в студии швейцарцев) мы используем аналоговые провода SDI, которые выходят из камеры и AJA ROI и приходят в DeckLink Duo на PC. Который, в определенный момент, по желанию преподавателя, начинает записывать два потока и аккуратно складывать их в папочку на сервере. AJA ROI выполняет роль cплиттера сигнала, устанавливается она между Mac mini и Wacom, дублирует канал который получает Mac mini и передает его на сервер.
Выше был представлен cхематический вид студии, чтобы можно было понять, как у нас расположены источники света и как проведены провода.
Камера
Камера Canon XA25 была выбрана не случайно. Дело в том, что данная модель является единственной на рынке в подобном ценовом сегменте, которая имеет SDI выход, и это очень важно.
Что же это за такой SDI канал и почему про него там редко слышно если он такой хороший?
SDI это стандарт передачи изображения который до сих пор используется на телевидении и средством передачи этого канала служит обычный коаксиальный кабель 75 Ом, который есть в каждом радиомагазине. Вот и всё. Так зачем же использовать этот SDI? Очень просто, если у вас 2 SDI канала кодируются в реальном времени, у вас нет проблем, если же использовать вместо SDI, протокол HDMI, то тут уже вам возможно потребуется дополнительное оборудование, способное в реальном времени обрабатывать эти потоки.
Также плюсами SDI является относительное отсутствие ограничений накладываемых на длинну кабеля и его надежное крепление
Итак, всё приехало, всё собрано, давайте запустим и посмотрим с камими проблемами мы можем столкнуться.
Проблемы
Первый неприятный сюрприз, который поджидал нас, – это ограничение на формат изображения по SDI каналу от камеры. Как я уже упоминал, камера является единственной в данном ценовом сегменте, которая умеет выдавать HD видео через аналоговый интерфейс. Но ложка дегтя заключается в том, что по SDI транслируется изображение в формате 1080i (тут можно почитать про различия 1080i и 1080p).
Вторая проблема: сигнала нет! Дело в том, что интерфейс SDI очень чувствителен к частоте кадров и разрешению, поэтому если камера у вас выдает 1080i и 50 кадров в секунду (именно такой формат выдает камера кэнон), то и на сервере должно стоять ровно 1080i и 50, в противном случае вы увидите чёрный экран и будете думать, что проблема не в настройках.
Даже если настройки на камере и сервере совпадают, иногда может случиться так, что изображения нет, – дело может быть в самих проводах. В таком случае надо просто проверить все контакты и найти слабое звено. Хотя сами крепления SDI очень надёжны и никогда не выпадут, проблема может быть где-то посередине кабеля. Мы столкнулись с такой проблемой и методом проб и ошибок нашли и устранили слабое место.
Хорошо, если все работает, давайте двигаться дальше.
Как же теперь записывать лекции на сервер? Хочется какое-то простое решение. Однако самое очевидное решение (использовать софт, поставляющийся в комплекте с картой захвата BlackMagic DeckLink) оказывается далеко не самым удобным.
Во-первых, начинать запись сам лектор не может, а значит нужен человек который будет это делать.
Во-вторых, DeckLink Studio не позволяет кодировать в реальном времени, а значит мы будем получать некомпрессированное видео = 1 минута около 1 GB…
Ну и последнее неудобство заключается в том что необходимо открывать две копии приложения от разных пользователей. Это конечно решается написанием bat-скрипта (напоминаю: сервер виндовый), но нажимая запись в двух разных каналах вручную, мы получаем 2 несинхронизированных файла.
Синхронная запись двух видеопотоков
Очевидное решение – использовать Mac сервер и купить Movie Recorder по 1000$ на канал. Именно так сделано у наших коллег в Швейцарии. Но мы решили пойти по другому пути. Конечно, были идеи реализовать кастомный интерфейс с помощью DeckLink SDK, но потом у нас появился чудный девайс который очень помогает нам по сей день. Итак, встречайте:
ATEM Television Studio. Вообще, предназначение данной карточки: в реалтайме кодировать видео с разных камер и позволять оператору переключаться между ними. Как обычно, софт поставляющийся в комплекте не очень то удобен. Однако на просторах интернета была найдена уже готовая софтина (MXLight) которая обладает интерфейсом командной строки и позволяет записывать изображение с канала подключенного к данной карте.
Итак, у нас есть bat-файл, который умеет начинать запись с камеры, и другой bat-файл, который умеет останавливать этот процесс:
set name=D:VIDEOCPP_CourseWeek3ProfessorStep4
set TIMESTAMP=%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
if exist %name%.TS ( START D:VIDEOMXLightMXLight.exe record-to-file=%name%_%TIMESTAMP%.TS record=on )
else ( START D:VIDEOMXLightMXLight.exe record-to-file=%name%.TS record=on )
Осталось разобраться с интерфейсом карточки DeckLink. Решение нашлось очень быстро – ffmpeg для Windows поддерживает DirectShow, а карта DeckLink является ничем иным как DirectShow устройством.
И вуаля – вот он bat-файл который запускает запись экрана:
set name=D:VIDEOCPP_CourseWeek3ScreenCastFinal_ScreenCast_LAST
set EXT=mp4
set TIMESTAMP=%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
if exist %name%.%EXT% ( START D:VIDEOffmpegbinffmpeg.exe -y -video_size 1920x1080 -pixel_format uyvy422 -rtbufsize 702000k -framerate 24 -f dshow -i video="Decklink Video Capture" %name%_%TIMESTAMP%.%EXT% )
else ( START D:VIDEOffmpegbinffmpeg.exe -y -video_size 1920x1080 -pixel_format uyvy422 -rtbufsize 702000k -framerate 24 -f dshow -i video="Decklink Video Capture" %name%.%EXT% )
А вот с остановкой записи экрана пришлось немного повозиться, дело в том, что нельзя просто взять и закрыть ffmpeg. В этом случае файл захвата будет поврежден, и может воспроизводится с помехами. Для корректного завершения режима видеозахвата нам необходимо послать с клавиатуры keypressed event «q».
Таким образом, всё равно нужен человек, который запускает запись и корректно ее останавливает.
Мне это очень не нравилось, и я решил в качестве эксперимента поднять простенький Node.js сервер, а поскольку на JS я никогда не писал, то и убить двух зайцев.
Так родилось приложение epicStudio, запуск которого осуществляет сам лектор из браузера, открытого на Wacom (Mac mini). Ссылка на гихтаб – epicStudio.
После запуска преподаватель начинает рассказывать лекцию и рисовать на слайдах. По окончании лекции, преподаватель самостоятельно останавливает запись и может начать запись новой темы. В конце дня мне остается только скачать файлы с сервера и склеить лекцию.
Этот процесс мы тоже постарались оптимизировать. Так, мной написаны различные инструменты для автоматического вырезания ненужных кусков, наложения ватермарков и приведения всех видеороликов к одинаковой громкости. Думаю, о них будет вкратце рассказано в следующий раз, в любом случае мои инструменты я выкладываю в этот репозиторий и там можно их посмотреть.