هل هناك طريقة نظيفة لتشغيل صوت mp3 في الإطار المضغوط 3.5

StackOverflow https://stackoverflow.com/questions/204562

سؤال

أستخدم طريقة p/invocation للعب wav اصوات.هناك طرق للاتصال بـ Windows Media Player لتشغيل ملف mp3 الصوت، ولكن بطيئة ومرهقة.

هل هناك طريقة سهلة للعب قصيرة mp3 ملف؟

هذا هو في المقام الأول للتطبيق المطالبة و إشارات مسموعة عندما لا تنظر إلى الشاشة وليس الموسيقى.

شكرًا!

هل كانت مفيدة؟

المحلول

يتضمن CF Framework 3.5 الآن دعمًا لتشغيل ملفات WAV:

نظام مساحة الاسم.Media.SoundPlayer

قد يتم تشغيل ملفات WAV القصيرة للإشارات والمؤثرات الصوتية أسرع من ملفات MP3 لأنها "جاهزة للتشغيل"...

نصائح أخرى

إذا كنت تبحث عن طريقة لتشغيل ملفات 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);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top