gpt4 book ai didi

c# - 使用 NAudio 获取 RTP 的 Ulaw 样本

转载 作者:行者123 更新时间:2023-11-30 14:37:16 29 4
gpt4 key购买 nike

我一直在查看 NAudio 示例,试图了解如何获得适合打包为 RTP 负载的 ulaw 样本。我正在尝试使用下面的代码从 mp3 文件生成示例。毫不奇怪,因为我真的不知道我在用 NAudio 做什么,所以当我通过网络将样本传输到软电话时,我得到的都是静态的。

谁能指导我如何使用 NAudio 从 MP3 文件中获取 160 字节(8Khz @ 20ms)ULAW 样本?

private void GetAudioSamples()
{
var pcmStream = WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader("whitelight.mp3"));
byte[] buffer = new byte[2];
byte[] sampleBuffer = new byte[160];
int sampleIndex = 0;
int bytesRead = pcmStream.Read(buffer, 0, 2);

while (bytesRead > 0)
{
var ulawByte = MuLawEncoder.LinearToMuLawSample(BitConverter.ToInt16(buffer, 0));
sampleBuffer[sampleIndex++] = ulawByte;

if (sampleIndex == 160)
{
m_rtpChannel.AddSample(sampleBuffer);
sampleBuffer = new byte[160];
sampleIndex = 0;
}

bytesRead = pcmStream.Read(buffer, 0, 2);
}

logger.Debug("Finished adding audio samples.");
}

最佳答案

这里有几点建议。首先,只要您使用的是 NAudio 1.5,就不需要额外的 WaveFormatConversionStream - Mp3FileReader 的 Read 方法返回 PCM。

但是,您不会得到 8kHz 输出,因此您需要先对其重新采样。 WaveFormatConversionStream 可以做到这一点,尽管它使用内置的 Windows ACM 采样率转换,似乎不能很好地过滤传入的音频,因此可能存在混叠伪像。

此外,您通常一次读取比两个字节更大的 block ,因为 MP3 解码器需要一次解码一个帧(重采样器也需要处理更大的 block 大小)。我会尝试一次读取至少 20 毫秒的字节。

您对 BitConverter.ToInt16 的使用对于获取 16 位样本值是正确的,但请记住 MP3 可能是立体声,具有左右样本。您确定您的手机需要立体声吗?

最后,我建议首先使用 WaveFileWriter 制作 mu-law WAV 文件。然后您可以在 Windows Media Player 中轻松收听它,并检查您发送到软电话的内容是否符合您的预期。

关于c# - 使用 NAudio 获取 RTP 的 Ulaw 样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9498280/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com