【问题标题】:Play wav file async multiple times with .net使用 .net 多次异步播放 wav 文件
【发布时间】:2010-12-14 00:10:18
【问题描述】:

我有一个应用程序,我需要在按下一个键时播放一个 wav 文件,我使用 SoundPlayer 类,但是如果在按下一个新键时正在播放另一个声音,它会停止声音并再次播放它长得丑……

有没有什么方法可以再次播放相同的声音,即使有另一个正在播放?

谢谢!

【问题讨论】:

    标签: c# audio wav


    【解决方案1】:

    将 Windows API 中的 PlaySoundSND_ASYNCSND_NOSTOP 标志结合使用。

    http://www.pinvoke.net/default.aspx/winmm.playsound

    用法

    //And the actual usage
    PlaySound (fileName, UIntPtr.Zero, (uint)(SoundFlags.SND_FILENAME | SoundFlags.SND_ASYNC | SoundFlags.SND_NOSTOP));
    

    声明

    [Flags]
    public enum SoundFlags
    {
        /// <summary>play synchronously (default)</summary>
        SND_SYNC = 0x0000,    
        /// <summary>play asynchronously</summary>
        SND_ASYNC = 0x0001,
        /// <summary>silence (!default) if sound not found</summary>
        SND_NODEFAULT = 0x0002,
        /// <summary>pszSound points to a memory file</summary>
        SND_MEMORY = 0x0004,
        /// <summary>loop the sound until next sndPlaySound</summary>
        SND_LOOP = 0x0008,    
        /// <summary>don't stop any currently playing sound</summary>
        SND_NOSTOP = 0x0010,
        /// <summary>Stop Playing Wave</summary>
        SND_PURGE = 0x40,
        /// <summary>don't wait if the driver is busy</summary>
        SND_NOWAIT = 0x00002000,
        /// <summary>name is a registry alias</summary>
        SND_ALIAS = 0x00010000,
        /// <summary>alias is a predefined id</summary>
        SND_ALIAS_ID = 0x00110000,
        /// <summary>name is file name</summary>
        SND_FILENAME = 0x00020000,
        /// <summary>name is resource name or atom</summary>
        SND_RESOURCE = 0x00040004
    }
    
    [DllImport("winmm.dll", SetLastError=true)]
    static extern bool PlaySound(string pszSound, UIntPtr hmod, uint fdwSound);
    

    更新

    抱歉,你是对的。该 API 不能用于同时播放声音。您应该使用waveOut api。看这篇文章:http://www.codeproject.com/KB/audio-video/cswavrec.aspx

    【讨论】:

    • 您好,感谢您的帮助,但它不能满足我的需要...它会等到声音播放完毕,而我需要的是同时开始播放新的声音.在其他作品中,这是一个游戏,当开枪时,播放一个 wav 文件,大约需要 2 秒,并且枪每秒可以开火很多次......所以我需要很多枪声秒
    • 您在调用PlaySound 时是否设置了SND_ASYNC 标志?这应该可以解决问题。
    • 但是当我几年前在游戏中使用 PlaySound 时,它并不能可靠地工作。使用更适合您使用的声音 api 可能是一个好主意。当时我在 DirectSound 上使用了一些包装器,但还有很多其他的。
    【解决方案2】:

    NAudio 可能会提供您需要的东西。我自己没用过,但是比较流行。

    【讨论】:

      【解决方案3】:

      有一个用于 .NET 的免费(用于非商业应用程序)声音库,名为 Irrklang,它支持同时播放多种声音(至少是我能收集到的 wav 和 mp3),它们的 tutorial 特别涵盖本案例作为库的基本用法。

      【讨论】:

        【解决方案4】:

        如果您要问“我怎样才能同时播放多个声音”,那么 SoundPlayer 永远不会是答案。 我相信 PlaySound 也同样受到限制。

        您可以查看 this questionthis question 以了解有关声音 API 的更多选项。我快速浏览了 SDL 和 SDL Mixer,并认为 SDL 太原始(您必须自己混合声音),而 SDL Mixer 太重(这就是一袋芯片 - 无限混音和音乐频道(mp3、ogg、midi 等)。我看不到 BASS 的 C# 绑定的在线参考资料,但它可以免费用于非商业用途。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-09
          • 1970-01-01
          • 1970-01-01
          • 2012-08-03
          • 2012-04-16
          • 1970-01-01
          相关资源
          最近更新 更多