NAudio WaveMixerStream32-使用实时音频源会在最终输出中产生crack啪声

问题描述

从现在到现在,我已经连续3周与这个问题作斗争了。

我想保持安静的程序的实际用例,但是我可以揭示出一般的前提。

我有一个相当广泛的disord.NET项目库,可用于创建discord机器人。我最近做的一件事是discord机器人,它将音频从一个语音通道转发到另一个语音通道,供个人使用,因此我不必太担心隐私元素。 (为此,我有2个通过Named Pipes链接discord机器人。

音频的接收方式是基于个人的,我的计划是在“监听”机器人上混合该音频,并将混合后的音频通过管道转发到“接收”机器人。

我正在使用NAudio进行混音,特别是我正在使用WavemixerStream32

3840个字节块接收音频,并以16-bit PCM 48000Hz Stereo格式接收音频。 (顺便说一句,一次可能需要将其中10个流与Wave mixer混合。)

我的理解是,这个3840字节的块一次可以产生50ms的音频? 3840/2(每个样本的字节数)/ 2(通道)= 960 ... 48000/960 = 50算出来正确吗?

我面临的问题是,无论我如何处理音频(无论是通过其他漫游器输出,还是从其中一个漫游器保存到文件),音频似乎总是发出奇怪的crack啪声,但不是开始,通常从大约3/4秒开始。

最初,我想知道这是否是Pipe问题,所以即使我使用WaveFileWriter直接写入WavFile,其中return reader;线在下面,我仍然收到奇怪的啪啪声和裂纹。我见过很多其他类似的SO问题,但是它们都没有任何有用的答案/评论

我希望收到一些人的意见,以了解可能导致我的问题的原因。

这是我用于混合音频的代码

public override Stream HandleAudio(List<UserAudioData> audioDatas,out int length)
{
    WavemixerStream32 mixer32 = new WavemixerStream32();
    bool streamAdded = false;

    int maxBytes = 0;

    if (audioDatas.Count == 0)
    {
        UserAudioData uad = new UserAudioData();
        uad.Data = new byte[3840];

        uad.UserId = 0;

        audioDatas.Add(uad);
    }

    foreach (UserAudioData uad in audioDatas)
    {
        MemoryStream rawStream = new MemoryStream(uad.Data,uad.Data.Length);
        rawStream.Position = 0;

        RawSourceWaveStream stream = new RawSourceWaveStream(rawStream,new WaveFormat(48000,2));

        WaveChannel32 channel32 = new WaveChannel32(stream);
        channel32.Volume = 1.0f / audioDatas.Count;

        mixer32.AddInputStream(channel32);

        streamAdded = true;

        if (maxBytes < uad.Data.Length)
        {
            maxBytes = uad.Data.Length;
        }
    }

    if (streamAdded)
    {
        Wave32To16Stream reader = new Wave32To16Stream(mixer32);

        length = maxBytes;
        return reader;
    }

    length = 0;
    return null;
}

UserAudioData类:

public class UserAudioData
{
    public byte[] Data { get; set; }
    public ulong UserId { get; set; }
    public ulong GuildId { get; set; }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)