首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SoundPlayer.PlaySync过早停止

SoundPlayer.PlaySync过早停止
EN

Stack Overflow用户
提问于 2011-01-15 05:43:13
回答 1查看 2K关注 0票数 0

我想在gui线程上同步播放wav文件,但我对PlaySync的调用提前返回(并过早地停止播放)。wav文件需要2-3分钟。

下面是我的代码:

代码语言:javascript
复制
        //in gui code (event handler)
        //play first audio file
        JE_SP.playSound("example1.wav");

        //do a few other statements
        doSomethingUnrelated();

        //play another audio file
        JE_SP.playSound("example2.wav");

    //library method written by me, called in gui code, but located in another assembly
    public static int playSound(string wavFile, bool synchronous = true,
        bool debug = true, string logFile = "", int loadTimeout = FIVE_MINUTES_IN_MS)
    {
        SoundPlayer sp = new SoundPlayer();
        sp.LoadTimeout = loadTimeout;
        sp.SoundLocation = wavFile;
        sp.Load();

        switch (synchronous)
        {
            case true:
                sp.PlaySync();
                break;
            case false:
                sp.Play();
                break;
        }

        if (debug)
        {
            string writeMe = "JE_SP: \r\n\tSoundLocation = " + sp.SoundLocation
                + "\r\n\t" + "Synchronous = " + synchronous.ToString();
            JE_Log.logMessage(writeMe);
        }

        sp.Dispose();
        sp = null;

        return 0;
    }

我想到的一些事情是加载超时,在另一个线程上播放音频,然后通过强制gui线程等待声音文件的持续时间来手动‘冻结’gui。我尝试延长加载超时时间,但没有效果。

我不太确定获得wav文件持续时间的最好方法是什么,而不是使用不是我/微软的人编写的代码。我想这是可以计算的,因为我知道文件的大小,并且所有的编码属性(比特率,采样率,采样大小等)在我打算播放的所有文件中都是一致的。有人可以详细说明如何使用这些信息来计算wav文件的持续时间吗?也就是说,如果没有人知道为什么PlaySync会提前返回。

编辑:

注意:不久前我在VB6中遇到了类似的问题,但这是由超时引起的,我不认为这是一个问题。较短(< 1分钟)的文件似乎播放得很好,所以我可能会决定手动编辑较长的文件,然后通过多次调用分别播放它们。

附加信息:我注意到同一文件在同一时间一致地停止。这些文件是使用Audacity创建的。有没有可能PlaySync期望文件的特定编码与我的Audacity生成的编码不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-01 04:40:14

为了防止其他人在同步播放一个大的wav文件时遇到问题,我写了一个使用WMP作为替代的方法:

代码语言:javascript
复制
public static int playSoundWMP(string soundFile, bool synchronous = true)
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();

        wmp.URL = soundFile;
        wmp.controls.play();

        Thread.Yield();

        while (wmp.playState == WMPLib.WMPPlayState.wmppsTransitioning)
        {
            Application.DoEvents();
            Thread.Yield();
        }

        int duration = Convert.ToInt32(wmp.currentMedia.duration * 1000);
        double waitTime = wmp.currentMedia.duration;

        if (synchronous)
        {
            Thread.Sleep(duration);
        }

        long elapsed = sw.ElapsedMilliseconds;
        sw.Stop();
        sw = null;

        return (int) wmp.currentMedia.duration * 1000;
    }

此方法使用WMP来播放音频文件,而不是SoundPlayer类,因此它可以更可靠地播放较大的wav文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4696284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档