Буферизация / синхронизация нескольких аудиопотоков в JavaScript

1

Вот краткий обзор моей проблемы:

Там будет центральный компьютер в художественной галерее и три отдельных удаленных сайта, скажем, в миле от центра. На каждом сайте есть музыкант. Центральный компьютер отправляет живую фонограмму через Интернет каждому из трех музыкантов, которые играют с ней и каждый записывается как живой эфир. Затем каждый из трех потоков воспроизводится в галерее, синхронизируется с фонограммой и другими музыкантами, как если бы все музыканты играли вживую в одной комнате. Клиент попросил музыкантов, как представляется, играть ТОЧНО во времени друг с другом, то есть без видимой латентности между каждым музыкантом. Музыканты не могут слышать друг друга, они слышат только фоновый трек.

Вот то, что я вижу как техническое решение:

Каждый пакет отслеживаемой дорожки отправляется из галереи с текущей меткой времени. Когда музыкант играет и записывается, записанный в данный момент пакет отмечен временной меткой текущего пакета треков. Когда три аудиопотока отправляются обратно, они буферизуются. Затем каждый пакет воспроизводится, скажем, через десять секунд после отметки времени. т.е. в 11:00:00 утра все пакеты, отмеченные 10:59:50 AM, воспроизводятся.

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

Я в идеале ищу для этого решение для JavaScript, так как это то, что я больше всего знаю (но о других решениях было бы интересно узнать и о них).

Кто-нибудь знает какие-либо библиотеки JavaScript со встроенными функциями, позволяющими такую буферизацию?

  • 0
    Здравствуйте и добро пожаловать в Stack Overflow, пожалуйста, найдите время, чтобы пройти приветственный тур, чтобы узнать свой путь здесь (а также заработать свой первый значок), прочитать, как создать пример минимального воспроизводимого примера, а также проверить, как спросить, чтобы вы увеличить ваши шансы получить обратную связь и полезные ответы.
  • 0
    Мне очень интересно знать, если некоторые библиотеки уже делают это .. Проблема с метками времени заключается в том, что вы должны быть заранее уверены, что 3 удаленных компьютера установлены в одно и то же время, потому что сервер не может знать, синхронизированы ли они или нет , Я предполагаю, что единственное действительно надежное решение - это иметь своего рода «галочку» в буферизованных данных (или в возврате), которые можно использовать для синхронизации
Показать ещё 1 комментарий
Теги:
audio
synchronization
streaming
live-streaming

1 ответ

0

Чтобы быть ясным, кажется, что неважно, что музыканты играют во времени друг с другом... только, что они играют вовремя с фонограммой и в течение ~ 10 секунд друг от друга, правильно? Предполагая, что случай...

Связь между сайтами

Вы можете использовать WebRTC для этого, но мы будем использовать только канал данных. Нет необходимости в медиапотоках. Это производительность, которая требует точного времени, и я также предполагаю, что качество звука тоже хорошее. Позвольте просто оставить его в PCM и отправить его по каналам данных WebRTC.

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

Аудиозапись и воспроизведение

Вы можете использовать ScriptProcessorNode для воспроизведения и записи. Это дает вам необработанный доступ к потоку PCM. Просто отправьте/получите байты через ваш канал данных. Если вы хотите сохранить некоторую полосу пропускания, вы можете уменьшить число с плавающей запятой до 16-битных целых чисел. Просто сверните их обратно, чтобы плавать на принимающей стороне.

синхронизация

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

При воспроизведении просто будьте все ваши дорожки, пока у вас не будет нужного уровня буфера, а затем воспроизведите их одновременно внутри вашего ScriptProcessorNode. Опять же, это точно.

Единственное, с чем вам придется иметь дело сейчас, это дрейф часов. Для меня 44,1 кГц может быть 44,099 кГц для меня. Это может складываться с течением времени, но, как правило, вам не нужно беспокоиться о том, если вы сбросите все это раз в какое-то время. То есть, пока вы не записываете целый день или более, не останавливаясь, это, вероятно, не будет проблемой для вас.

Записанные пакеты должны быть отмечены меткой времени входящего пакета дорожки отслеживания

Нет, эта синхронизация не должна происходить на сетевом уровне. Если вы используете надежный транспорт с каналами данных WebRTC или Web Socket, вам не нужно ничего делать, кроме запуска всех ваших потоков в байте 0. Не используйте временные метки, используйте смещения образца.

Кто-нибудь знает какие-либо библиотеки JavaScript со встроенными функциями, позволяющими такую буферизацию?

Я на самом деле построил проект для создания похожих вещей, который позволяет использовать точную передачу интернет-радио с одного сайта на другой. Он создает буфер с течением времени, а затем для раздачи он в основном повторно синхронизирует с основными часами с нового сайта. Поскольку новый сайт находится за старым сайтом, и поскольку мы не можем легко сгибать пространство/время, я немного выхожу из буфера и забираю его на новые основные часы сайта. (Ничего не изменилось, если бы существовал буфер с одного сайта!) В любом случае, я не знаю другого кода, который делает это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню