4

我使用 p/invoke 方法来播放wav声音。有一些方法可以调用 windows 媒体播放器来播放mp3声音,但它速度慢且麻烦。

有没有简单的方法来播放短mp3文件?

这主要用于当您不看屏幕而不看音乐时的应用程序提示声音提示。

谢谢!

4

2 回答 2

14

如果您正在寻找播放 mp3 的方法:

公共课声音
{
    [DllImport("aygshell.dll", SetLastError = true)]
    私有静态外部 IntPtr SndPlaySync(string pszSoundFile, uint dwFlags);
    [DllImport("aygshell.dll")]
    private static extern uint SndOpen(string pszSoundFile, ref IntPtr phSound);
    [DllImport("aygshell.dll")]
    私有静态外部 uint SndPlayAsync(IntPtr hSound, uint dwFlags);
    [DllImport("aygshell.dll")]
    私有静态外部 uint SndClose(IntPtr hSound);
    [DllImport("aygshell.dll")]
    私有静态外部 uint SndStop(int SoundScope, IntPtr hSound);

    常量 int SND_SCOPE_PROCESS = 0x1;
    私人静态随机_随机=新随机();

    // 初始化启动路径...您将在其中保存临时 mp3
    私有静态字符串_startupPath;
    公共静态字符串 StartupPath
    {
        得到{返回声音._startupPath; }
        设置 { Sound._startupPath = value; }
    }

    私有枚举 SND
    {
        同步 = 0x0000,
        异步 = 0x0001,
        节点默认 = 0x0002,
        内存 = 0x0004,
        循环 = 0x0008,
        NOSTOP = 0x0010,
        现在 = 0x00002000,
        别名 = 0x00010000,
        别名 ID = 0x00110000,
        文件名 = 0x00020000,
        资源 = 0x00040004
    }

    公共静态无效播放声音(字符串文件名)
    {
        播放声音(文件名,空);
    }

    public static void PlaySound(string fileName, WaitCallback 回调)
    {
        SndStop(SND_SCOPE_PROCESS, IntPtr.Zero);
        ThreadPool.QueueUserWorkItem(playSoundProcess,
            新对象 [] {文件名,回调 });
    }

    私人静态无效playSoundProcess(对象o)
    {
        对象[] par = (object[])o;
        字符串文件名 = (string)par[0];
        WaitCallback 回调 = (WaitCallback)par[1];
        SndPlaySync(文件名,0);

        尝试
        {
            文件.删除(文件名);
        }
        抓住
        { }

        如果(回调!= null)
            回调。调用(文件名);
    }

    公共静态无效ClearSounds()
    {
        SndStop(SND_SCOPE_PROCESS, IntPtr.Zero);
        尝试
        {
            string[] oldFiles = Directory.GetFiles(StartupPath, "*.mp3");
            foreach(oldFiles 中的字符串 f)
                文件.删除(f);
        }
        抓住
        { }
    }



    public static void PlaySound(byte[] mp3, WaitCallback 回调)
    {
        string temp = string.Format("{0}\\{1}-{2}.mp3", StartupPath, DateTime.Now.Ticks, _random.Next());
        使用 (FileStream fs = File.Create(temp))
        {
            fs.Write(mp3, 0, mp3.Length);
        }

        播放声音(临时,回调);
    }
}
于 2009-12-28T23:15:21.943 回答
5

CF Framework 3.5 现在支持播放 .WAV 文件:

命名空间 System.Media.SoundPlayer

用于提示和音效的短 WAV 文件甚至可能比 MP3 播放得更快,因为它们是“准备播放”的......

于 2008-10-15T18:44:00.193 回答