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

Синхронизация звука по сети

Я нахожусь в процессе разработки системы клиент/сервер, которая может передавать аудио произвольно по сети. Один центральный сервер выкачивает аудиопоток, а х число клиентов получает аудиоданные и воспроизводит их. До сих пор не было никакой магии, и я даже получил этот сценарий для работы с медиа-проигрывателем VLC из коробки.

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

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

Некоторые продукты, которые уже решают проблему (однако все еще недостаточно для моего общего использования):

http://www.sonos.com

http://netchorus.com/

Любые указатели приветствуются. Спасибо.

PS: Этот связанный вопрос, похоже, давно умер.

4b9b3361

Ответ 1

Райан Барретт написал свои выводы в своем блоге.

Его решение включало использование NTP в качестве способа сохранения всех синхронизированных часов:

Серьезно, однако, есть только один трюк к p4sync, и именно так использует NTP. Один хост действует как p4sync сервер. Другие клиенты p4sync синхронизировать свои системные часы с сервер, используя SNTP. Когда сервер начинает играть песню, она записывает время, в миллисекунду. Затем клиенты извлекают этот отметьте временную метку, вычислите разницу между текущим временем отметьте метку времени и ищите вперед в песню.

Ответ 2

Жесткая проблема, но возможно.

Используйте NTP или tictoc, чтобы получить синхронизированные часы с известной скоростью с точки зрения источника вашей системы.

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

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

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

Ответ 3

Ознакомьтесь с бумагой Звуковой системой интернет-протокола от Tom Blank от Microsoft Research. Он решает точную проблему, над которой вы работаете. Его решение включает синхронизацию часов по машинам и использование временных меток, чтобы каждый из них играл одновременно. Недостатком этого подхода является латентность. Чтобы синхронизировать все синхронизированные часы, требуется тиснение времени при наибольшей задержке в сети.

Ответ 4

В зависимости от размера и формы места, все, что нужно синхронизировать, - это легкая часть, и все, чтобы звучать правильно, - это сама форма искусства, если это вообще возможно. С технической стороны самой сложной частью является обнаружение задержки с вашей синхронизированной временной шкалы на фактический выход звука. Наличие идентичных аппаратных средств и программного обеспечения с малой задержкой (ASIO, JACK), безусловно, помогает здесь, равно как и калибровка. Либо досрочно, либо активно. В противном случае он просто синхронизирует временную шкалу с NTP и использует обратную связь с замкнутым контуром к тональному звуку для синхронизации выхода с согласованной временной шкалой.

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

Ответ 5

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

Я бы сначала экспериментировал с сетевыми технологиями, флеш-проигрывателями с дистанционным управлением  сервером через Javascript.

Если это дало плохие результаты, я попытался бы получить больше контроля, используя что-то вроде python (с pygame).

Если бы прогресс был достигнут, я также попытался бы использовать ChucK и попробовать некоторое низкоуровневое программирование с аудио-библиотекой ALSA.

Если ничего удовлетворительного не выйдет, я бы придумал и перечитал этот пост и действительно прочитал что-то разумное от гуру аудиопрограмм-экспертов и, если бы зависело от него, я, вероятно, в конечном итоге развожу 14 английских фунтов для коммерческого приложения NetChorus или чего-то еще аналогично.