синхронизация аудио по сети

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

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

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

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

http://www.sonos.com

http://netchorus.com/

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

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

42
задан Community 23 May 2017 в 10:29
поделиться

5 ответов

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

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

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

31
ответ дан 26 November 2019 в 23:54
поделиться

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

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

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

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

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

0
ответ дан 26 November 2019 в 23:54
поделиться

Серьезная проблема, но возможная.

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

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

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

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

10
ответ дан 26 November 2019 в 23:54
поделиться

Посмотрите статью An Internet Protocol Sound System Тома Бланка из Microsoft Research. Он решает именно ту проблему, над которой вы сейчас работаете. Его решение включает синхронизацию часов на всех машинах и использование временных меток, чтобы позволить им играть в одно и то же время. Недостатком этого подхода является задержка. Чтобы синхронизировать все часы, нужно поставить метку времени с наибольшей задержкой в сети.

10
ответ дан 26 November 2019 в 23:54
поделиться

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

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

6
ответ дан 26 November 2019 в 23:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: