winforms 两个音频同步播放和更改CurrentTime

4bbkushb  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(143)

我正在尝试制作一个简单的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();
}

请让我知道如果我需要提供更多的相关细节。

eblbsuwk

eblbsuwk1#

您希望将按钮事件交换为:

// skip 10 sec button click handler
private void ButtonSkip10Sec_Click(object sender, EventArgs e)
{
    var newTime = ch1.CurrentTime + TimeSpan.FromSeconds(10);
    
    if (newTime <= ch1.TotalTime)
    {
        ch1.CurrentTime = newTime;
        ch2.CurrentTime = newTime;
    }
}

这可能是停止音频,然后调整CurrentTime,然后再次启动音频可能会导致两个音频文件之间的小延迟。
上面的代码将每个通道的CurrentTime调整到新的时间,而不停止音频。它还检查新时间是否超出音频的TotalTime,在这种情况下,它不会调整CurrentTime。
如果不是这样,那么它可能与NAudio以及它如何处理流有关,希望不是这样,因为我希望这会更难解决。

相关问题