Получение аудиоданных из нескольких источников и объединение их в волновой файл
Я использую C# и DirectSound для записи аудио и отправки его по локальной сети на другой компьютер, который получает данные и сохраняет их в волновой файл.
Я использовал аналогичный код для записи и аналогичный для сохранения волнового файла (используя NAudio).
Сохранение всех полученных байтов в волновой файл работает. Но я хотел бы получить аудио с нескольких компьютеров и объединить его в один волновой файл.
Я попытался записать два отдельных волновых файла, по одному для каждого клиента, а затем слил их вместе. Однако мой наивный подход не предоставляет никаких средств синхронизации. Получающиеся волновые файлы различаются по длине как минимум на 5 секунд и не могут быть соответствующим образом объединены.
Итак, вот мои вопросы:
1) Как я могу взять аудиобайты, полученные из сети, и сохранить их в волновой файл таким образом, чтобы полученный файл воспроизводил звук в нужное время?
Например, я записываю 100 секунд аудио и отправляю его по сети. Но только 95 секунд аудио байтов фактически записаны. Пропущенные 5 секунд являются результатом накопления небольших задержек, возникающих во время отправки пакетов.
Итак, как я могу синхронизировать эти 95 секунд аудио для воспроизведения в нужное время, в течение 100 секунд?
2) Как я могу смешать аудиобайты, которые я получаю от нескольких клиентов, чтобы получить единый волновой файл, который воспроизводит аудио всех клиентов синхронно?
Пожалуйста, дайте мне знать, если мне нужно уточнить мой вопрос. Я ценю любую помощь!
2 ответа
Вам нужна высокоточная синхронизация времени на участвующих компьютерах (плюс отметки времени на отправленных пакетах). Чтобы свести к минимуму смещение тактовой частоты, вы можете выполнить повторную синхронизацию через заранее определенные интервалы (менее предпочтительно) или установить аппаратные часы более высокого качества (желательно). Если эти машины находятся в локальной сети, установка одного из них в качестве NTP-сервера и других в качестве клиентов даст достаточно синхронизированные часы (т. Е. В пределах 0,000001 секунды друг от друга или лучше).
Если вы хотите синхронизировать звук из нескольких источников, то вам нужно буферизовать данные на принимающей стороне. Не пишите и не воспроизводите аудиоданные, пока у вас не будет по крайней мере сэмплов BUFFERSIZE из каждого участвующего источника. Вам нужно будет настроить BUFFERSIZE в зависимости от задержки вашей сети.
Вы можете сделать это, используя два потока: один для записи или воспроизведения аудиоданных, а другой для буферизации входящих потоков. Когда сэмплы BUFFERSIZE получены от каждого аудиоисточника, принимающий поток передает все данные другому потоку для записи или воспроизведения. Как правило, всегда будет так, что большинство потоков имеют больше выборок, чем BUFFERSIZE. Вы должны были бы сохранить эти остатки для следующей заправки.