Подтвердить что ты не робот

Синхронизируйте видео на нескольких клиентах как можно точнее?

Я хотел бы синхронизировать воспроизведение видео на нескольких клиентах. Один клиент предоставит серверу URL-адрес видео, которое может быть передано по потоку, и нажмите кнопку воспроизведения, и каждый клиент должен начать воспроизведение видео в одно и то же время. И во время игры нужно убедиться, что каждый клиент все еще синхронизирован. Если кто-то внезапно перестает играть, все остальные должны как можно скорее остановиться. (В этот момент клиент, который остановился, будет отставать от 1 секунды или около того). Затем, когда тот же самый человек начинает играть снова, все остальные, очевидно, должны будут ждать секунду, пока один клиент не поймает, а затем тоже начнет играть.

Моя первая попытка состояла в том, чтобы настроить mySQL db и позволить каждому клиенту постоянно сообщать о своем текущем видеоролике. Затем сервер вычисляется, если какой-либо клиент в db отстает, и если да, рассчитан для каждого клиента, как долго им придется приостановить, чтобы догнать его.

Но это не очень хорошо работает. Это сильно зависело от вашей задержки, и я не смог заставить ее надежно работать с задержкой < 300ms (для этого требовалась действительно хорошая латентность).

Так что я могу сделать, чтобы улучшить его? Должен ли я изменить свою настройку (javscript ↔ ajax ↔ php ↔ mySQL)?

Как я могу достоверно рассчитать время прохождения ответа, которое сервер отправляет клиенту? Я имею в виду, я не могу просто предположить, что системное время клиента такое же, как у сервера... Лучшее, что я мог придумать, было бы примерно так:

var start = new Date().getTime()
$.post( "sync.php", "")
.done(function(data) {
    var end = new Date().getTime()/1000;
    var clientServerClientTravelTime = (end-start);
    var estimatedServerClientTravelTime = clientServerClientTravelTime/2;
});

Любая идея, как я мог бы улучшить эту концепцию?
Видео Btw не может быть на моем собственном сервере.

4b9b3361

Ответ 1

Я предлагаю для программирования NodeJS и сокетов. Далее вы можете использовать http://www.webrtc.org

Ответ 2

Наиболее точным способом, вероятно, будет использование сокетов: таким образом вы можете сигнализировать другим системам о том, что требуется, и не нужно ждать опроса ajax. Вы не сможете точно компенсировать задержку, но могли бы усреднить ситуацию, измеряя кругосветное путешествие с помощью некоторых тестовых сообщений.

Таким образом, план будет выглядеть следующим образом:

  • все клиенты, предварительно загрузившие видео, готовые к року.
  • все клиенты открывают сокет на сервер и указывают, что они готовы ругаться
  • сервер выполняет несколько быстрых тестовых сообщений для измерения задержки. Сервер
  • отправляет сообщение "идти" всем клиентам, возможно, задерживаясь для учета задержки (или указывает время, когда клиент приостанавливается, в любом случае работает).
  • Если клиент останавливается, он отправляет сообщение серверу; сервер немедленно отправляет сообщение другим клиентам для остановки.
  • клиенты отвечают, где они приостановлены
  • При перезапуске настройте стартовые сообщения для учета как латентности, так и того факта, что некоторые клиенты временно приостановлены.

Я использовал что-то очень похожее на синхронизацию 18 проекторов на 3 машины для системы отображения AV. (https://vimeo.com/97191170). Несмотря на комментарии Xorifelse в своем ответе, PHP был совершенно доступен для приема, обработки и обработки до 100 сокетов в секунду с контроллера (приложение на основе jquery в браузере, связанное сокетами), отфильтровывание дубликатов, запись их всех в mySQL для второй процесс опроса по требованию (примерно 10 раз в секунду, вызванный запросом сокета от Flash (Adobe Air) script, а затем также передал легкие инструкции для освещения под автомобилем (также через разъемы) или другим автомобилям ( также через сокеты).На самом деле, решение PHP/MySQL было гораздо более надежным, чем попытка перенаправить инструкции сокетов непосредственно во Flash. Это очень возможно. Техническая информация для проекта приведена здесь: http://labs.soapcreative.com/cars-that-feel-vivid-sydney/

Ответ 3

Как сказал кто-то другой, я бы, вероятно, установил небольшой сервер веб-узлов в NodeJS. Идея заключается в создании списка событий, таких как "Play", "Pause". Когда клиент подключается, он запрашивает сервер, на котором он должен начать играть (так как другой клиент мог запустить его до этого), или если вы хотите, чтобы вы каждый раз отправляли событие "StartAgain" всем клиентом. После начала видео вы можете прослушивать события HTML Audio/Video, чтобы определить, перестало ли проигрываться видео клиента. В этом случае вы отправляете на сервер событие "Пауза", которое будет транслировать его всем остальным клиентам, чтобы приостановить воспроизведение. Когда видео возобновляется, вы можете отправить событие "Воспроизвести".

Ответ 4

Вы пытались использовать WebRTC, он используется для одноранговых соединений и для потоковой передачи. Используя WebRTC, вы можете делать многопоточный поток от одного клиента к другим, я использовал его для потоковой передачи видео другим людям, и все, кто подключается, получают видео, но я не транслирую его на сервере, я только контролировал видео, пауза, звук,.....

Вы можете попробовать использовать его, но в вашем случае каждый клиент может управлять потоком. Лично я не пробовал что-то подобное, но таким образом у вас нет проблем с задержкой, паузами и т.д.