我正在尝试制作一个简单的C# WinForms应用程序,基于NAudio,它允许我播放两个完全同步的音频文件(两个具有相同持续时间的曲目一致播放:基本上,它们应该同时从头开始,并一起结束)
我还需要操纵音量(单独,为每个轨道)和播放位置(一个单一的控制,就像一个按钮,一旦点击,使两个轨道前进10秒,但总是一致)在播放过程中
看起来一切都很好,但是当我以编程方式改变播放位置时,两个轨道的相位会有一点不一致(随着每一次新的迭代,情况会变得更糟)
下面是我使用的代码的亮点:
// variables
AudioFileReader fr1, fr2;
WaveChannel32 ch1, ch2;
MixingWaveProvider32 mix;
WaveOut wo;
// button play click handler
private void ButtonPlay_Click(object sender, EventArgs e)
{
fr1 = new AudioFileReader("track1.mp3");
fr2 = new AudioFileReader("track2.mp3");
ch1 = new WaveChannel32(fr1, 1.0f, 0f);
ch2 = new WaveChannel32(fr2, 1.0f, 0f);
ch1.CurrentTime = new TimeSpan(0L);
ch2.CurrentTime = new TimeSpan(0L);
mix = new();
mix.AddInputStream(ch1);
mix.AddInputStream(ch2);
var wo = new();
wo.Init(mix);
wo.Play();
}
// one of two volume sliders volumeChanged handler
private void VolumeSlider1_VolumeChanged(object sender, EventArgs e)
{
ch1.Volume = VolumeSlider1.Volume;
}
// skip 10 sec button click handler
private void ButtonSkip10Sec_Click(object sender, EventArgs e)
{
wo.Stop();
ch1.CurrentTime += TimeSpan.FromSeconds(10);
ch2.CurrentTime += TimeSpan.FromSeconds(10);
wo.Play();
}
请让我知道如果我需要提供更多的相关细节。
1条答案
按热度按时间eblbsuwk1#
您希望将按钮事件交换为:
这可能是停止音频,然后调整CurrentTime,然后再次启动音频可能会导致两个音频文件之间的小延迟。
上面的代码将每个通道的CurrentTime调整到新的时间,而不停止音频。它还检查新时间是否超出音频的TotalTime,在这种情况下,它不会调整CurrentTime。
如果不是这样,那么它可能与NAudio以及它如何处理流有关,希望不是这样,因为我希望这会更难解决。