Сжатие / распаковка аудиоданных - PullRequest
2 голосов
/ 06 марта 2009

Я использую Win32 API формы сигнала в приложении C #, чтобы сделать систему VoIP. все идет хорошо, однако мне нужен какой-то способ сжатия аудиоданных на лету.

, поэтому в основном аудиоданные поступают в буфер записи размером 150 байт, а затем этот буфер отправляется по протоколу udp, а на удаленном конце 150 байтов принимаются и помещаются в буфер воспроизведения.

поэтому мне нужен какой-то способ сжатия / распаковки данных непосредственно перед udp-> send и сразу после udp-> recv. обычные алгоритмы сжатия не работают со звуком, включая класс .NET GZip.

Кто-нибудь знает о библиотеке, которую я могу использовать, которая поможет мне сделать это?

заранее спасибо ...

Ответы [ 4 ]

1 голос
/ 06 марта 2009

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

Тем не менее, если вы отправляете речевые данные, посмотрите на Speex для сжатия с потерями (я считаю, что это очень эффективно при сжатии речи, но качество звука ужасно для музыки.)

1 голос
/ 06 марта 2009

Я бы подумал, что вы захотите объединить эти 150-байтовые куски, чтобы получить лучшее сжатие.
Хотя даже при таких небольших размерах буфера вы можете получить некоторое сжатие.

Если встроенный GZipStream не работает, вы можете попробовать GZipStream, включенный в DotNetZip . В DotNetZip также имеется класс ZlibCodec, который реализует шаблон кодека - это может облегчить сжатие в 150-байтовых блоках.

0 голосов
/ 09 марта 2009

Как предложено выше, я бы посмотрел в Speex. Это хорошо поддерживается, и теперь стандарт де-факто для Flash Player.

Я предполагаю, что из-за размера, который вы устанавливаете в своих буферах, задержка является проблемой (чем больше буфер, тем больше задержка), поэтому не используйте кодек с большим размером распакованного кадра, потому что он вводит высокая задержка Это более или менее исключает MP3 ... для голоса с частотой дискретизации 5 кГц (это не будет иметь большого значения при повышении частоты), минимальный размер распакованного кадра составляет 576 выборок или ~ 100 мс данных, которые необходимо кодировать перед отправкой , Это означает, что задержка в обоих направлениях составляет более 200 мс, прежде чем вы даже решите проблему с сетью.

0 голосов
/ 06 марта 2009

Компонент, который вы ищете, более известен как кодер / декодер, или кодек , и существует множество вариантов выбора одного.

...