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

Posted

技术标签:

【中文标题】从 WasapiLoopbackCapture 捕获音频,并转换为 muLaw【英文标题】:Capture audio from WasapiLoopbackCapture, and convert to muLaw 【发布时间】:2018-01-12 19:47:43 【问题描述】:

我正在使用 WasapiLoopbackCapture 捕获音频

- 格式 = ieeeFloat - 采样率 = 48000 - BitsPerSample = 32

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

【问题讨论】:

【参考方案1】:

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() 时,数据都会经过所有这些过滤器。

【讨论】:

这似乎是一些有价值的信息,不幸的是它与“自定义IWaveProvider”有很大差距......根据我对c#的理解,它需要是这样的吗? gist.github.com/programmin1/c011dba09ac7d30f734926b074863167 但是,读取的代码是您给出的示例,它不会编译。 我已经做到了这一点,但我不确定 MuLawEncoder 做了什么,或者它在这个答案中对 int16s 做了什么? ***.com/questions/58678228/…

以上是关于从 WasapiLoopbackCapture 捕获音频,并转换为 muLaw的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB实战系列(三十九)-matlab多目标优化之海洋捕食者算法

2022-06-03:a -> b,代表a在食物链中被b捕食, 给定一个有向无环图,返回这个图中从最初级动物到最顶级捕食者的食物链有几条。 来自理想汽车。

海洋捕食者算法(MPA) 解决单目标优化问题

海洋捕食者算法(MPA) 解决单目标优化问题

多目标海洋捕食者算法(MOMPA) 解决多目标优化问题

多目标海洋捕食者算法(MOMPA) 解决多目标优化问题