SoundPlayer.PlaySync останавливается преждевременно

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

  •  11-10-2019
  •  | 
  •  

Вопрос

Я хочу воспроизводить файл wav синхронно в потоке графического интерфейса, но мой призыв к Playsync возвращается рано (и преждевременно останавливает воспроизведение). Файл WAV составляет 2-3 минуты.

Вот как выглядит мой код:

        //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;
    }

Некоторые вещи, о которых я подумал, - это тайм -аут загрузки, и воспроизведение звука в другой ветке, а затем вручную «заморозить» графический интерфейс, заставив потоку графического интерфейса ждать продолжительности звукового файла. Я попытался удлинить тайм -аут нагрузки, но это ничего не сделало.

Я не совсем уверен, какой лучший способ получить продолжительность файла WAV без использования кода, написанного кем -то, кто не я/Microsoft. Я полагаю, что это можно рассчитать, так как я знаю размер файла, и все свойства кодирования (битрейт, скорость дискретизации, размер выборки и т. Д.) Постоянны во всех файлах, которые я собираюсь воспроизводить. Может ли кто -нибудь уточнить, как вычислить продолжительность файла WAV, используя эту информацию? То есть, если ни у кого нет представления о том, почему PlaySync возвращается рано.

Редакты:

Следует отметить: я столкнулся с аналогичной проблемой в VB 6 некоторое время назад, но это было вызвано тайм -аутом, что я не подозреваю, что здесь проблема. Более короткие (<1 мин) файлы, кажется, играют нормально, поэтому я могу решить вручную отредактировать более длинные файлы, а затем воспроизвести их отдельно с несколькими вызовами.

Дополнительная информация: я заметил, что тот же файл останавливается последовательно одновременно. Файлы были созданы с использованием смелости. Было бы возможно, что PlaySync ожидает определенного кодирования файлов, которые отличаются от того, что у меня было смелость?

Это было полезно?

Решение

На случай, если кто -то еще сталкивается с проблемами с синхронным воспроизведением файлов WAV, вот метод, который я написал, который использует WMP в качестве альтернативы:

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 более надежно ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top