【问题标题】:NAudio playback won't stop successfullyNAudio 播放不会成功停止
【发布时间】:2010-05-11 15:15:41
【问题描述】:

当使用NAudio 播放MP3 文件[在控制台中] 时,我不知道如何停止播放。当我调用 waveout.Stop() 时,代码会停止运行,并且 waveout.Dispose() 永远不会被调用。

跟函数回调有关系吗?如果是,我该如何解决?

static string MP3 = @"song.mp3";
static WaveOut waveout;
static WaveStream playback;
static void Main(string[] args)
{
    waveout = new WaveOut(WaveCallbackInfo.FunctionCallback());
    playback = OpenMp3Stream(MP3);
    waveout.Init(playback);
    waveout.Play();
    Console.WriteLine("Started");

    Thread.Sleep(2 * 1000);

    Console.WriteLine("Ending");
    if (waveout.PlaybackState != PlaybackState.Stopped)
        waveout.Stop();
    Console.WriteLine("Stopped");
    waveout.Dispose();
    Console.WriteLine("1st dispose");
    playback.Dispose();
    Console.WriteLine("2nd dispose");
}
private static WaveChannel32 OpenMp3Stream(string fileName)
{
    WaveChannel32 inputStream;
    WaveStream mp3Reader = new Mp3FileReader(fileName);
    WaveStream pcmStream = WaveFormatConversionStream.CreatePcmStream(mp3Reader);
    WaveStream blockAlignedStream = new BlockAlignReductionStream(pcmStream);
    inputStream = new WaveChannel32(blockAlignedStream);
    return inputStream;
}

【问题讨论】:

  • 我觉得 using 语句在这里会很方便,但我没有 naudio,所以我无法真正测试它。
  • 这只是示例代码,我认为从长远来看,使用 using 语句不会真正起作用。它实际上根本没有从调用 waveout.Stop() 中返回。它进入函数,似乎根本没有离开。

标签: c# .net audio naudio


【解决方案1】:

您是说代码在对 waveOutReset 的调用中挂起?如果是这样,这是函数回调和某些音频驱动程序的已知问题(SoundMAX 似乎特别容易受到此影响)。几个月前,我检查了 NAudio 源代码的可能修复,因此您可以尝试构建最新的代码,看看是否能解决问题。

【讨论】:

  • 太棒了!很高兴我偶然发现了这一点。我遇到了完全相同的问题。
【解决方案2】:

我在这里的第一个猜测是,由于您没有 console.read() 或类似的调用,因此您的代码执行速度非常快,以至于您看不到最终的写入行。

如果 NAudio 实现 IDisposable,那么我建议使用 using 语句让 .NET 为您处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多