gpt4 book ai didi

c# - NAudio:正确使用 MixingSampleProvider 和 VolumeSampleProvider

转载 作者:行者123 更新时间:2023-12-02 04:09:05 25 4
gpt4 key购买 nike

我一直在使用 NAudio“Fire and Forget Audio Playback with NAudio”教程(感谢 Mark 提供了这个很棒的实用程序!),如下所示: http://mark-dot-net.blogspot.nl/2014/02/fire-and-forget-audio-playback-with.html

我设法向其中添加了一个 VolumeSampleProvider,使用 MixingSampleProvider 作为输入。但是,当我现在紧接着播放两个声音时,第一个声音也总是获得第二个声音的音量,即使第一个声音已经在播放。

所以我的问题是:如何为每个声音添加单独音量的声音?

这是我用的:

        mixer = new MixingSampleProvider(waveformat);
mixer.ReadFully = true;
volumeProvider = new VolumeSampleProvider(mixer);
panProvider = new PanningSampleProvider(volumeProvider);
outputDevice.Init(panProvider);
outputDevice.Play();

最佳答案

我意识到(感谢 itsmatt)实现此功能的唯一方法是在将混音器添加到混音器之前单独放置混音器并单独调整每个 CachedSound 的声相和音量。因此,我需要重写 CachedSoundSampleProvider,使用声像和音量作为额外的输入参数。

这是新的构造函数:

    public CachedSoundSampleProvider(CachedSound cachedSound, float volume = 1, float pan = 0)
{
this.cachedSound = cachedSound;
LeftVolume = volume * (0.5f - pan / 2);
RightVolume = volume * (0.5f + pan / 2);
}

这是新的 Read() 函数:

    public int Read(float[] buffer, int offset, int count)
{
long availableSamples = cachedSound.AudioData.Length - position;
long samplesToCopy = Math.Min(availableSamples, count);

int destOffset = offset;
for (int sourceSample = 0; sourceSample < samplesToCopy; sourceSample += 2)
{
float outL = cachedSound.AudioData[position + sourceSample + 0];
float outR = cachedSound.AudioData[position + sourceSample + 1];

buffer[destOffset + 0] = outL * LeftVolume;
buffer[destOffset + 1] = outR * RightVolume;
destOffset += 2;
}

position += samplesToCopy;
return (int)samplesToCopy;
}

关于c# - NAudio:正确使用 MixingSampleProvider 和 VolumeSampleProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37766281/

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