Как сохранить данные adpcm в файл типа wav, mp3 в телефонной системе?

#c# #audio #wav #naudio #adpcm

#c# #Аудио #wav #naudio #adpcm

Вопрос:

Существуют следующие системы телефонной связи.

система

Среди них я собираюсь разработать повторитель. Повторитель выполняет связь по протоколу tcp / ip.

Получите данные adpcm в байтах от пользователя 1 и пользователя 2 соответственно.

Я хочу сохранить данные, полученные от ретранслятора, в виде аудиофайла.

Как только данные с одной стороны (user1) были собраны и преобразованы в массив байтов, я создал файл wav с помощью Naudio, но это не удалось.

Когда я воспроизводю его с помощью приложения для воспроизведения по умолчанию window10, оно воспроизводится около 1 секунды и заканчивается. Однако общее время воспроизведения больше, например, 6 секунд и 7 секунд.

Приведенные ниже данные являются частью начала двоичных данных созданного мной файла wav.

52 49 46 46 В4 65 00 00 57 41 56 45 66 6D в 74 20 32 00 00 00 02 00 01 00 40 1Ф 00 00 00 10 00 00 00 01 04 00 20 00 Ф4 01 07 00 00 01 00 00 00 02 00 код ff 00 00 00 00 00 40 00 00 00 00 С0, Ф0 чч 01 30 FF в 88 01 18 ФФ 66 61 63 74 04 00 00 00 С4 Калифорния 00 00 64 61 74 61 62 65 00 00 77 77 77 68 08 08 08 08 08 08 08 08 08 08 80 08 08 9А 99 99 90 01 21 21 12 25 53 40 9А В9 91 24 34 11 8А БК АА 80 13 17 43 42 12 09 8А АБ ДБ ББ БА 9А 88 12 02 А0 БА ББ БД А9 8А 01 33 33 31 10 1а 0В ББ БА А0 91 22 32 11 90 А9 ББ ВВ 9б 11 23 33 41 11 19 9Б АБ В9 11 22 13 35 11 08 99 АА до н. э. А1 А1 00 31 31 11 А9 0А АБ ВВ 9а 10 13 14 12 91 90 9Б 9Б В9, А0 11 13 41 29 29 09 9Б АБ В9 09 10 13 33 11 А9 ББ ВВ Калифорния 09 00 12 33 33 39 39 1А АА В9 В1 91 22 33 40 01 90 до н. э. А9 А9 99 01 31 41 01 9а 9б 9в 9А 9А 90 01 33 33 21 01 09 9Б А9 90 11 11 33 33 21 01 0А 9Б 9А 99 01 03 14 10 19 99 В9 ББ БА В0 90 12 33 11 20 91 А9 99 9А 01 02 11 33 01 10 09 99 В0 А0 10 12 13 31 29 99 9Б 9А В0 99 90 01 11 21 90 91 09 19 09 10 90 12 03 19 19 19 09 99 19 99 00 11 13 10 90 99 БА В9 В0 99 00 01 91 00 99 11 99 00 11 01 11 11 11 19 99 11 91 91 11 00 10 01 20 01 90 99 АА 01 91 99 99 9А 9А 9А 99 19 01 10 11 11 21 11 3А 09 99 90 00 31 11 19 10 91 91 11 01 9А

Вот код, который я реализовал (audiodata — это массив байтов adpcmdata):

         var adpcmWaveFormat = new AdpcmWaveFormat(8000, 1);

        using (WaveFileWriter writer = new WaveFileWriter("D:\test.wav", adpcmWaveFormat))
        { 
            writer.Write(audiodata, 0, audiodata.Length);
        }
 

Как я могу сохранить данные adpcm в виде аудиофайла?

И как мне сохранить голоса пользователей 1 и 2 в одном файле одновременно?

Комментарии:

1. Когда вы воспроизводите результирующий файл в чем-то вроде VLC, как это звучит?

Ответ №1:

Заголовки файла (из вашего блока данных выше) выглядят нормально для моно ADPCM с частотой 8 кГц. Все они написаны NAudio, поэтому я ожидаю, что они будут соответствовать коду. Этот конкретный файл содержит 51 908 сэмплов (~ 6,5 секунд), что соответствует объему данных в блоке данных в 25 954 байта. Пока все хорошо … если данные в формате Microsoft ADPCM.

К сожалению, существует множество форматов ADPCM с небольшими различиями, будь то коэффициенты, используемые кодеком, количество бит на выборку (от 2 до 6, хотя 4 является наиболее распространенным), поддерживаемые частоты дискретизации и блочное кодирование. G723 раньше был распространен в телефонии, но вы найдете все виды.

Помимо различий в поддерживаемых функциях (бит на выборку, количество каналов, частота выборки и т. Д.), В разных форматах используются разные структуры блоков. IMA / DVI ADPCM создают блоки сэмплов с 4-байтовым заголовком, чтобы исправить дрейф и вернуть состояние декодера в синхронизацию.

Если бы мне пришлось угадывать, я бы выбрал что-то вроде формата ADPCM Dialogic / OKI.