0

这个问题来自我之前的线程 Play mp3 from internet without FileOpenDialog

我真的希望有人对此有所了解。我被告知使用 WebRequest 开始下载流,然后播放流而不是播放本地存储的文件。但是,尝试使用 PlayMp3FromUrl 中的代码会给我这个错误:

“'NAudio.Wave.WaveOut' 不包含采用 '3' 参数的构造函数”

在这一行编译失败:

using (WaveOut waveOut = new WaveOut(0, 500, null))

这是完整的代码:

public static void PlayMp3FromUrl(string url)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            using (Stream stream = WebRequest.Create(url)
                .GetResponse().GetResponseStream())
            {
                byte[] buffer = new byte[32768];
                int read;
                while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
            }

            ms.Position = 0;

            using (WaveStream blockAlignedStream =
                new BlockAlignReductionStream(
                    WaveFormatConversionStream.CreatePcmStream(
                        new Mp3FileReader(ms))))
            {
                using (WaveOut waveOut = new WaveOut(0, 500, null))
                {
                    waveOut.Init(blockAlignedStream);
                    waveOut.Play();
                    while (blockAlignedStream.Position < blockAlignedStream.Length)
                    {
                        System.Threading.Thread.Sleep(100);
                    }
                }
            }
        }
    }

有人可以帮我找出 WaveOut 需要哪些参数吗?

编辑:你可能想看看 WaveOut.cs,它很长。所以只要看看这里WaveOut.cs

4

3 回答 3

1

我从未使用过 waveout 类,如果可以的话,我建议使用 DirectX。

using (IWavePlayer directOut = new DirectSoundOut(300))               
{                    
   directOut.Init(blockAlignedStream);                    
   directOut.Play();                    
   while (blockAlignedStream.Position < blockAlignedStream.Length)
   {                       
      System.Threading.Thread.Sleep(100);                    
   }                
}
于 2009-08-31T19:24:14.697 回答
1

只需使用默认构造函数(无参数)。最新的 NAudio 代码具有 WaveOut 类的属性,而不是具有 3 个参数的旧构造函数。如果它引起很多问题,我可能会放回旧的构造函数并用 [Obsolete] 属性标记它。

第一个参数是设备号。0 表示使用默认设备。

第二个是延迟。500ms 是我们提前缓冲的音频量。这是一个非常保守的数字,应该确保无故障播放。

三是与waveOut的回调机制有关。不幸的是,没有一种万能的解决方案。如果您传递 null,NAudio 将使用函数回调,但这可能会挂在某些音频芯片组上。如果可能的话,最好传递一个窗口句柄。

于 2009-09-01T06:37:05.873 回答
0

You are passing three arguments to the WaveOut constructor: 0, 500, null but there is no constructor on the WaveOut class that takes that many arguments.

Why are you passing three arguments to the WaveOut constructor?

于 2009-08-31T16:56:21.313 回答