代码之家  ›  专栏  ›  技术社区  ›  Kurru

Naudio播放无法成功停止

  •  3
  • Kurru  · 技术社区  · 15 年前

    使用时 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;
    }
    
    2 回复  |  直到 11 年前
        1
  •  3
  •   Mark Heath    15 年前

    你是说代码挂在WaveOutReset的调用中吗?如果是这样,这是函数回调和某些音频驱动程序的已知问题(SoundMax似乎特别容易受此影响)。几个月前,我签入了一个可能的Naudio源代码修复程序,所以您可以尝试构建最新的代码,看看是否修复了这个问题。

        2
  •  0
  •   Mitchel Sellers    15 年前

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

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

    推荐文章