
Как работает синхронизация плеера в AniDUO
Что происходит, когда кто-то в комнате жмёт паузу: общее состояние на сервере, сверка часов, догоняющее ускорение и ожидание перед стартом серии.
Виктор3 мин чтенияКак устроеноAniDUO
Общий плеер выглядит просто: нажал паузу, и она встала у всех. Внутри всё чуть хитрее, и это не маркетинговая магия, а пара скучных инженерных решений. Рассказываем, как оно устроено, без формул.
Главный принцип: правда живёт на сервере
У каждой комнаты одно состояние плеера, и хранит его сервер. Серия, позиция, играет видео или стоит. Браузер участника у себя ничего не решает, он только показывает то, что сказал сервер.
Когда вы нажимаете паузу, браузер не ставит видео на паузу сам. Он отправляет серверу просьбу: «поставь на паузу». Сервер проверяет, можно ли вам управлять плеером, меняет состояние комнаты и рассылает его всем, в том числе вам. Отсюда простое свойство: двое не могут поставить комнату в два разных состояния. Кто успел первым, того и правда.
Часы у всех разные
Сказать «видео на 12:40» мало, нужно ещё «на 12:40 в такой-то момент времени». А часы на компьютерах расходятся, иногда на секунды. Для совместного просмотра это пропасть.
Поэтому при входе в комнату браузер несколько раз подряд обменивается с сервером короткими сообщениями и засекает, сколько идёт ответ. Из пяти замеров берутся три лучших, по ним вычисляется разница между вашими часами и серверными. Потом сверка повторяется раз в 30 секунд, чтобы поправка не уплыла.
С этой поправкой любой браузер сам считает, на какой секунде серии комната находится прямо сейчас.
Отстал? Догоняем без рывков
Интернет у всех разный, видео иногда подгружается с задержкой. Плеер каждые полсекунды сравнивает, где он сам и где комната.
- Разница меньше 0,3 секунды: ничего не делаем, на глаз её не заметить.
- От 0,3 до 2 секунд: видео у отставшего играет на 5% быстрее, у убежавшего вперёд на 5% медленнее. Когда разрыв сжимается до 0,1 секунды, скорость возвращается в норму. Сам момент догонялки почти никто не замечает.
- Больше 2 секунд: плавно уже не догнать, поэтому плеер просто перематывает к остальным.
Выходит, что медленный интернет у одного человека портит просмотр только ему, и то ненадолго. Остальные его не ждут.
Перед стартом комната ждёт всех
Когда включается новая серия, видео должно загрузиться у каждого. Если стартовать сразу, половина комнаты начнёт с чёрного экрана.
Поэтому комната сначала ждёт. На экране появляется «Ждём: …» со списком тех, у кого серия ещё грузится, и обратным отсчётом. Как только все готовы или время вышло, серия стартует у всех одновременно.
Что происходит, если связь отвалилась
Браузер пробует переподключиться сам: сначала через секунду, потом всё реже, но не реже раза в 30 секунд. После переподключения он спрашивает у сервера текущее состояние комнаты и встаёт туда, где все. Ничего нажимать не нужно.
Опоздавшие работают так же. Зашёл в комнату посреди серии, и плеер сразу ставит тебя на нужную секунду.
Опенинги, эндинги и следующая серия
AniLiberty размечает, где в серии опенинг и эндинг. На полосе перемотки эти куски подсвечены, а пока идёт опенинг, в плеере есть кнопка «Пропустить опенинг». Нажал её один, пропустили все: это такая же команда комнате, как пауза.
Когда серия заканчивается, следующая включается автоматически, и в ленте комнаты появляется запись об этом.
Кто вообще может жать кнопки
По умолчанию все. Владелец комнаты может переключить режим: управлять плеером будет только он или выбранные участники. Проверка идёт на сервере, поэтому обойти её, покопавшись в браузере, не получится.
Если хотите посмотреть, как это выглядит вживую, на главной есть демо с двумя плеерами. Нажмите паузу в одном и посмотрите на второй.
Позовите друзей и включайте серию
Бесплатно, до 10 человек в комнате.


