тип аудио пакета - PullRequest
       32

тип аудио пакета

2 голосов
/ 11 декабря 2011

Я начинаю работать над проектом, который передает звук G.711 через Ethernet, написанный на C (не C ++) и работающий на Fedora 15. Вместо того, чтобы делать умные вещи и использовать RTP, я использую UDP для передачи аудио данные. Чтобы немного преодолеть проблему переупорядочения пакетов, я решил использовать структуру в теле каждого пакета, которая выглядит примерно так:

struct payload {
  char cc;
  char audio_data[160];
};

Переменная "cc" является счетчиком непрерывности, который работает от 0-15, и когда пакет прибывает к получателю, он помещается в массив этих структур на основе значения cc. Затем процедура вывода звука проходит через этот массив и воспроизводит данные.

У меня вопрос, это лучший способ упаковать аудио? Выходной массив будет в конечном итоге двухмерным, и, конечно, он будет медленно читать каждый элемент и записывать его в выходной файл? Есть ли способ определить тип шириной 160 байт, который я могу просто записать в аудиоинтерфейс на другом конце?

Будем весьма благодарны за любые предложения, а также ссылки на полезные ресурсы по ALSA (которые кажутся очень редкими!)

Josh

1 Ответ

1 голос
/ 11 декабря 2011

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

Поскольку G.711 является кодеком с постоянной скоростью передачи битов, вы можете выбрать размер буфера в единицах времени (200 мс для разговора).Вы играете всегда последний пакет в буфере.Например, последний полученный вами пакет имеет cc = n, затем вы получите cc = m (> n).Таким образом, вы помечаете все пакеты между n и m как отсутствующие и заменяете их, если получите их позже.

...