当前位置:  开发笔记 > 开发工具 > 正文

有没有一种干净的方式来在紧凑的框架3.5中播放mp3声音

如何解决《有没有一种干净的方式来在紧凑的框架3.5中播放mp3声音》经验,为你挑选了2个好方法。

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

有一种简单的方法来播放短mp3文件吗?

当您不是在看屏幕而不是音乐时,这主要用于应用程序提示声音提示.

谢谢!



1> nikib3ro..:

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

public class Sound
{
    [DllImport("aygshell.dll", SetLastError = true)]
    private static extern IntPtr SndPlaySync(string pszSoundFile, uint dwFlags);
    [DllImport("aygshell.dll")]
    private static extern uint SndOpen(string pszSoundFile, ref IntPtr phSound);
    [DllImport("aygshell.dll")]
    private static extern uint SndPlayAsync(IntPtr hSound, uint dwFlags);
    [DllImport("aygshell.dll")]
    private static extern uint SndClose(IntPtr hSound);
    [DllImport("aygshell.dll")]
    private static extern uint SndStop(int SoundScope, IntPtr hSound);

    const int SND_SCOPE_PROCESS = 0x1;
    private static Random _random = new Random();

    // init startup path... where you'll hold temp mp3s
    private static string _startupPath;
    public static string StartupPath
    {
        get { return Sound._startupPath; }
        set { Sound._startupPath = value; }
    }

    private enum SND
    {
        SYNC = 0x0000,
        ASYNC = 0x0001,
        NODEFAULT = 0x0002,
        MEMORY = 0x0004,
        LOOP = 0x0008,
        NOSTOP = 0x0010,
        NOWAIT = 0x00002000,
        ALIAS = 0x00010000,
        ALIAS_ID = 0x00110000,
        FILENAME = 0x00020000,
        RESOURCE = 0x00040004
    }

    public static void PlaySound(string fileName)
    {
        PlaySound(fileName, null);
    }

    public static void PlaySound(string fileName, WaitCallback callback)
    {
        SndStop(SND_SCOPE_PROCESS, IntPtr.Zero);
        ThreadPool.QueueUserWorkItem(playSoundProcess, 
            new object[] {fileName, callback });
    }

    private static void playSoundProcess(object o)
    {
        object[] par = (object[])o;
        string fileName = (string)par[0];
        WaitCallback callback = (WaitCallback)par[1];
        SndPlaySync(fileName, 0);

        try
        {
            File.Delete(fileName);
        }
        catch
        { }

        if (callback != null)
            callback.Invoke(fileName);
    }

    public static void ClearSounds()
    {
        SndStop(SND_SCOPE_PROCESS, IntPtr.Zero);
        try
        {
            string[] oldFiles = Directory.GetFiles(StartupPath, "*.mp3");
            foreach (string f in oldFiles)
                File.Delete(f);
        }
        catch
        { }
    }



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

        PlaySound(temp, callback);
    }
}


我不得不修改这个代码,所以它不会删除我的mp3文件,但除此之外,它一旦修复就会产生奇迹.

2> 小智..:

CF Framework 3.5现在包括对播放.WAV文件的支持:

命名空间System.Media.SoundPlayer

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

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有