【问题标题】:Naudio - 'WaveOut' does not contain a constructor that takes '3' argumentsNaudio - “WaveOut”不包含采用“3”参数的构造函数
【发布时间】:2010-11-24 09:18:20
【问题描述】:

这个问题来自我之前的帖子 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

【问题讨论】:

    标签: c# constructor arguments naudio


    【解决方案1】:

    您将三个参数传递给 WaveOut 构造函数:0、500、null,但 WaveOut 类上没有构造函数接受这么多参数。

    为什么要将三个参数传递给 WaveOut 构造函数?

    【讨论】:

    • 这是因为代码看起来像编写它的人,在这个 Stackoverflow 链接中:stackoverflow.com/questions/184683/…
    • 我猜 WaveOut.cs 从那以后发生了变化。但我不知道要传递哪些参数。
    【解决方案2】:

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

    using (IWavePlayer directOut = new DirectSoundOut(300))               
    {                    
       directOut.Init(blockAlignedStream);                    
       directOut.Play();                    
       while (blockAlignedStream.Position < blockAlignedStream.Length)
       {                       
          System.Threading.Thread.Sleep(100);                    
       }                
    }
    

    【讨论】:

    • 哇,这确实有效 :) 但是程序仍然冻结(在播放 mp3 文件时),可能是什么导致了这个问题?由于代码中发生了很多事情,因此似乎也很难调试。而且我真的不知道是什么原因造成的。
    • 您的 while 循环阻塞了您的程序。使播放器成为一个类字段并在其中运行开始停止命令,或者在不同的线程中处理它。
    • 好吧,我不知道该怎么做。它需要很多改变吗?还有一件事,你知道流是如何在本地存储的吗?无论如何我会播放下载的缓存还是重新下载?我真的很想要某种缓存。就像 OpenFileDialog 本身一样。据您所知,这可能吗?是的,我在 C# 上很烂。我尝试用 VB.NET 来做到这一点,但遇到了困难。所以我想我会尝试 C# 原始源代码。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 嗨,马克!我已经尝试不使用任何参数。这会导致表格完全冻结。而且播放似乎也不起作用。使用 DirectSoundOut 也会冻结表单,但播放会在 3-4 秒左右后正常工作。不幸的是,我是个彻头彻尾的白痴,所以我不知道如何传递窗口句柄。我想我知道这意味着什么,您已经在文档或类似文件中写过一些关于它的内容。但由于上述原因,我不知道该怎么做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 2013-02-16
    • 2015-05-04
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多