Я открыл для себя Udemy как сервис около 5–6 лет назад. Ниже вы можете прочитать, что мне показалось интересным, понаблюдав за плеером в течение нескольких часов.

ВебВТТ

Формат текстовых дорожек веб-видео, или WebVTT, представляет собой спецификацию для разметки внешних ресурсов текстовых дорожек и размещения их в <track> элементах.

Существует реализация для Node.js и браузеров, которая называется vtt.js (версии от VideoJS и Mozilla).

Оказывается, Udemy использует VideoJS версия 0.12.4 (28 апреля 2017 г.) в качестве запасного значения. Версия для меня была 0.12.6 (13 фев 2018).

VTT-файлы выглядят так:

Udemy также использует WebVTT для отображения всплывающих окон с помощью спрайтов миниатюр:

Статистика

Разработка видеоплеера не очевидна: он включает в себя функции, специфичные для браузера (например, Полноэкранный API, Promise, Модули JavaScript через тег скрипта и т. д.), зависит от других используемых библиотек (например, hls.js , shaka-player, videojs и так далее). Вот почему это общий подход к отправке событий игрока и последующему анализу данных.

Udemy использует XMLHttpRequest в _sendBeaconQueue для синхронных запросов и sendBeacon в _clearBeaconQueue для асинхронных запросов. Данные отправляются в виде последовательности событий.

Полный пример XMLHttpRequest доступен здесь. Вы можете видеть временную метку UTC как uti, название события как e, идентификатор видео как vid и т. д. События отправляются на https://<ake>.litix.io, где <ake> – идентификатор пользователя. beaconUrl — это https://vfq2nsli1v76fglgdl9puq0cd.litix.io.

Полный пример sendBeacon доступен здесь. Вы можете увидеть больше данных о браузере, ОС, библиотеках, контенте, курсе и так далее и тому подобное. beaconUrl здесь тоже https://vfq2nsli1v76fglgdl9puq0cd.litix.io.

DRM

Все видео моих старых курсов (и даже то, что я купил сейчас) в формате MP4. Я не нашел ничего, что включало бы DRM. Однако url к потоку включает 2 GET-параметра для доступа к нему: nva и token, иначе доступ запрещен.

Элемент тега видео содержит источник потока и воспроизводит его без проблем. Если вы попытаетесь поставить src без этих параметров, вы получите ошибку:

Алексей Березин,
Front-end Developer от Яндекс

LinkedIn
GitHub