问题描述
从现在到现在,我已经连续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 (将#修改为@)