Я работаю над приложением VOIP, которое будет передавать аудиоданные по сети с помощью NAudio. Я не хочу передавать потоковое сырье PCM из-за проблем с пропускной способностью, поэтому я пытаюсь кодировать сэмплы в µ-законе. До сих пор я не смог найти никаких объяснений того, как именно это делается. Я предполагаю, что должен использовать NAudio.Codecs.MuLawEncoder.LinearToMuLawSample(short s)
, но проблема в том, что мне дан байтовый массив в событии DataAvailable.
Я пробовал перебирать буфер DataAvailable, вызывая LinearToMuLawSample для каждого байта. Тем не менее, фактический размер массива, очевидно, не меняется, и поэтому я не получаю никакого уменьшения размера.
Вот код, отвечающий за кодировку:
byte[] sample = _rawSamples.Take(); //take from sample buffer
for (int i = 0; i < sample.Length; i++) //actual conversion code
sample[i] = MuLawEncoder.LinearToMuLawSample(sample[i]);
_encodedSamples.Add(sample); //add to network buffer
Вот содержимое моего обработчика DataAvailable:
private void _input_DataAvailable(object sender, WaveInEventArgs e)
{
byte[] buffer = e.Buffer;
Array.Resize(ref buffer, e.BytesRecorded);
_rawSamples.Add(audioData);
}
И, наконец, вот как я объявляю свой WaveIn:
_input = new WaveIn();
_input.BufferMilliseconds = 100;
_input.DataAvailable += _input_DataAvailable;
_input.RecordingStopped += _input_InputRecordingStopped;
По сути, я ищу способ взять данные PCM в виде байтового массива и преобразовать их в формат, подходящий для отправки по сети. Я не совсем понимаю, как класс MuLawEncoder может на самом деле кодировать / сжимать аудиоданные таким образом.