c# - 从 WasapiLoopbackCapture 捕获音频,并转换为 muLaw

标签 c# naudio pcm wasapi mu-law

我正在使用 WasapiLoopbackCapture 捕获音频

- format        = IeeeFloat
- SampleRate    = 48000
- BitsPerSample = 32

我需要将其转换为 muLaw(8Khz,8 位,单声道) - 最终它将通过 SIP 中继发送到电话。我已经尝试了 100 个样本(其中大部分使用 NAudio)和解决方案,但仍然不知道如何做到这一点......

最佳答案

NAudio 中的 Mu-Law 工具有限,因此您可能需要自己开发。

您需要设置一系列 IWaveProvider 过滤器来转换为单声道、更改比特率和更改位深度。

waveBuffer = new BufferedWaveProvider(waveIn.WaveFormat);
waveBuffer.DiscardOnBufferOverflow = true;
waveBuffer.ReadFully = false;  // leave a buffer?

sampleStream = new WaveToSampleProvider(waveBuffer);

// Stereo to mono
monoStream = new StereoToMonoSampleProvider(sampleStream)
    {
        LeftVolume = 1f,
        RightVolume = 1f
    };

// Downsample to 8000
resamplingProvider = new WdlResamplingSampleProvider(monoStream, 8000);

// Convert to 16-bit in order to use ACM or MuLaw tools.
ieeeToPcm = new SampleToWaveProvider16(resamplingProvider);

然后为下一步创建自定义 IWaveProvider。

// In MuLawConversionProvider
public int Read(byte[] destinationBuffer, int offset, int readingCount)
{
    // Source buffer has twice as many items as the output array.
    var sizeOfPcmBuffer = readingCount * 2;
    _sourceBuffer = BufferHelpers.Ensure(_sourceBuffer, sizeOfPcmBuffer);
    var sourceBytesRead = _sourceProvider.Read(_sourceBuffer, offset * 2, sizeOfPcmBuffer);
    var samplesRead = sourceBytesRead / 2;

    var outIndex = 0;
    for (var n = 0; n < sizeOfPcmBuffer; n += 2)
    {
        destinationBuffer[outIndex++] = MuLawEncoder.LinearToMuLawSample(BitConverter.ToInt16(_sourceBuffer, offset + n));
    }

    return samplesRead * 2;
}

新的提供商可以直接发送到 WaveOut

outputStream = new MuLawConversionProvider(ieeeToPcm);
waveOut.Init(outputStream);
waveOut.Play();

这些过滤器仍然以 BufferedWaveProvider 作为“根”。每当您调用 BufferedWaveProvider.AddSamples() 时,数据都会经过所有这些过滤器。

关于c# - 从 WasapiLoopbackCapture 捕获音频,并转换为 muLaw,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48233099/

相关文章:

c# - C# 中的默认值属性

c# - 通过 MethodInfo 调用方法

c# - 使用 C# 确定输入到文本框中的字符数

c# - 在NAudio中解码GSM 6.10部件

c - 使用 DirectSound 播放立体声 PCM

audio - 带有 fmod 的 PCM 数据格式 - 多个平台上的差异

c# - 进度条直到100%才更新

c# - 混合两个不同比特率的wav文件

audio - "16bit integer PCM data"是否意味着它已签名或未签名?

audio - 使用 NAudio 发送播放音频