Как синхронизировать воспроизведение мультимедиа по ненадежной сети? - PullRequest
5 голосов
/ 01 марта 2009

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

Я хочу сделать это через Wi-Fi, что ненадежно.

Алгоритмически, как лучше всего подойти к этой проблеме?

РЕДАКТИРОВАТЬ 1

Для меня не имеет значения, воспроизводят ли оба компьютера один и тот же носитель или один воспроизводит его и передает на другой поток.

Я уверен, что это решаемая проблема, потому что я однажды видел демонстрацию динамиков Wi-Fi. Это было 5 с лишним лет назад, поэтому я считаю, что технология должна упростить сегодня.

Ответы [ 2 ]

6 голосов
/ 29 июня 2011

(Я сам искал приложение, которое делало это, надеясь, что мне не придется писать его самостоятельно, когда я наткнулся на этот вопрос.)

Обзор

Вы вводите немного задержки буфера и используете сетевой протокол синхронизации времени для выравнивания потоков. То есть вы разделяете поток на пакеты и ставите временную метку для каждого пакета с помощью «воспроизведения позже в момент времени T», где T составляет, например, 50–100 мс в будущем (или больше, если сеть работает с ошибками). Вы отправляете (или многоадресно) пакеты в локальной сети на все компьютеры в хоре. Все компьютеры будут воспроизводить звук одновременно, потому что часы приложения синхронизированы.

Обратите внимание, что могут быть и другие факторы, такие как задержка ОС / драйвера / звуковой карты, которые могут быть учтены в протоколе синхронизации времени. Если вы не слишком разборчивы, протокол синхронизации может быть таким же простым, как один компьютер, подающий звуковой сигнал каждую секунду, плюс вы нажимаете клавишу на другом компьютере в такт. Это имеет то преимущество, что учитывает любой другой источник задержки на уровнях ОС / драйвера / звуковой карты, но имеет тот недостаток, что необходимо ручное вмешательство, если часы становятся десинхронизированными.


гибридная ручная сетевая синхронизация

Одним из способов учета других источников задержки без постоянного ручного вмешательства является объединение этого подхода со стандартным протоколом синхронизации сетевых часов; при первом запуске протокола на новых машинах:

  1. синхронизация машин с ручным вмешательством в стиле ритма
  2. синхронизация машин с протоколом синхронизации по сети
  3. для каждой машины в хоре, возьмите разницу двух синхронизаций; это задержка ОС / драйвера / звуковой карты каждой машины, которую каждый из них отслеживает

Теперь, когда изменяется сетевая магистраль, все, что нужно сделать, это выполнить повторную синхронизацию с использованием протокола синхронизации сетевых часов (#2) и вычесть задержки ОС / драйвера / звуковой карты, устраняя необходимость ручного вмешательства (если только вы смени ОС / драйверы / звуковые карты).


синхронизация светлячка, имитирующая природу

Если вы делаете это в тихой комнате, и на всех машинах есть микрофоны, вам даже не нужно вмешиваться вручную (#1), потому что вы можете заставить их всех следовать алгоритму синхронизации «в стиле светлячка». Многие виды светлячков в природе все будут мигать в унисон. http://tinkerlog.com/2007/05/11/synchronizing-fireflies/ описывает алгоритм, используемый этими светлячками: «Если светлячок получает вспышку соседнего светлячка, он мигает немного раньше». Вспышки соответствуют звуковым сигналам или гудкам (через звуковую карту, а не зуммер mobo пьезо!), А зрение соответствует прослушиванию через микрофон.

Это может быть немного неудобно на очень больших расстояниях в комнате из-за скорости звука, но я сомневаюсь, что это будет проблемой (если так, уменьшите частоту звукового сигнала).

0 голосов
/ 01 марта 2009

Синхронизация зависит от положения слушателя относительно каждого динамика. Я не думаю, что надежность сети будет иметь столько же общего с этой синхронизацией, сколько с содержанием аудиопотока. Для синхронизации вам нужно найти расстояние между каждым динамиком и слушателем. Найдите разницу между каждым из этих значений и значением для самого дальнего динамика. Для каждых 1,1 фута разницы задержите каждый из близких динамиков на 1 мс. Это гарантирует, что аудиопоток достигает слушателя одновременно. Все это предполагает открытую область, так как любая, находящаяся поблизости от вашего сценария, будет генерировать отражения звуковых волн и создавать разрушительные помехи. Объекты в этой области могут также передавать звук с меньшей скоростью, что приводит к задержке собственного звука.

...