Несколько месяцев назад, когда Google объявил об отказе от поддержки Silverlight в Chrome, CANAL+ начала работу над новым проигрывателем, использующим новый HTML5 API (MSE, EME, …) для воспроизведения видео.

Этот проигрыватель теперь используется пользователями CANAL+ на сайте myCANAL.

Сегодня мы рады открыть исходный код и надеемся, что это поможет сообществу воспроизводить видеоконтент в Интернете.

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

Многие современные реализации видеоплееров полагаются на классическую объектно-ориентированную иерархию и императивные обратные вызовы событий с общими изменяемыми объектами для управления всеми этими асинхронными задачами и состояниями. Мы обнаружили, что этот подход является неправильной абстракцией для обработки сложности видеоплеера.

Rx, напротив, предоставляет удобные интерфейсы и операторы для объединения асинхронных задач, представляя изменяющиеся состояния в виде наблюдаемого потока значений. Он также поставляется с контрактом отмены, так что каждый асинхронный побочный эффект может быть правильно устранен, когда система отбрасывает его (это все еще спорный вопрос в сообществе JS).

Это позволило нам довольно легко реализовать некоторые полезные функции. Например, поскольку в rx-player все асинхронные задачи инкапсулированы в наблюдаемые структуры данных, мы смогли добавить прозрачную систему повторных попыток с простым наблюдаемым оператором для декларативной обработки любого сбоя и воспроизведения всего процесса.

Другим примером является то, как мы абстрагировали наш транспортный уровень в наблюдаемый конвейер, что позволило нам поддерживать различные типы потоковых систем с их собственными асинхронными особенностями. А поскольку Rx управляется сообщениями, эта инкапсуляция позволяет нам изолировать транспортный ввод-вывод в WebWorker без каких-либо усилий или добавить автономную поддержку для любой реализации конвейера.

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

Первоначально опубликовано на сайте developers.canal-plus.com 29 июня 2015 г.