2012-04-22 1 views
2

Я использую C# и DirectSound для записи звука и отправки его через локальную сеть на другой компьютер, который принимает данные и сохраняет их в волновой файл.Получение аудиоданных из нескольких источников и их слияние в волновой файл

Я использовал аналогичный code for recording и аналогичный for saving волновой файл (используя NAudio).

Сохранение всех принятых байтов в волновой файл. Но я хотел бы получить звук с нескольких компьютеров и объединить его в один файл.

Я попытался записать два отдельных волновых файла, по одному для каждого клиента, а затем объединить их. Однако мой наивный подход не предоставляет никаких средств синхронизации. Полученные волновые файлы отличаются длиной не менее 5 секунд и не могут быть соответствующим образом объединены.

Итак, вот мои вопросы:

1) Как я могу принимать аудио байт, полученных из сети и сохранять их в файл волны таким образом, что результирующий файл воспроизводит аудио в нужное время?

Например, я записываю 100 секунд звука и отправляю его по сети. Но на самом деле записано только 95 секунд аудио байтов. Отсутствующие 5 секунд являются результатом накопления небольших задержек, возникающих при отправке пакетов.

Итак, как я могу синхронизировать эти 95 секунд аудио для воспроизведения в нужное время в течение 100 секунд?

2) Как я могу объединить звуковые байты, которые я получаю от нескольких клиентов, для получения одного волнового файла, который воспроизводит звук всех клиентов в синхронизации?

Пожалуйста, дайте мне знать, если мне нужно уточнить мой вопрос. Я ценю любую помощь!

+0

Вам нужно время x, чтобы быть одинаковым на всех отправителе? т. е. должны ли они иметь одну и ту же временную базу? – thalm

+0

Если вы делаете громкий шум, я хочу, чтобы он отображался на всех записях одновременно. –

ответ

3

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

+0

@aleph_null Итак, вы собираетесь отбросить 25 репутации, а не принять ответ и дать награду за полную награду? –

+0

Нет, у меня будет очень напряженный день и не забудьте выбрать ответ прямо перед крайним сроком ... и тогда вам трудно выбрать ответ, так как они оба одинаковы! –

+0

Огромное спасибо вам и Винни Фалько. –

2

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

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

+0

Проблема с этим подходом заключается в том, что он будет работать, только если все программы отправляют аудио с точно такой же скоростью. Например, одно передающее аудио устройство, которое я использую, является андроидом и имеет тенденцию иметь небольшую задержку между записью аудиопакетов. Таким образом, запись 100 секунд приводит к 95 секундам аудио. Таким образом, звук будет несинхронизирован. Дайте мне знать, если мне нужно уточнить. –

+0

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

+0

@VinnieFalco правый. Сетевым соединениям необходимо поддерживать очереди буферов, в то время как аудиоплеер опорожняет их с постоянной скоростью. Стоимость, которую вы платите, находится в дополнительном латентном состоянии, но выбора нет. –