Sajid_Qureshi Ответов: 2

Воспроизведение аудиофайлов mp3 один за другим замораживает форму


Привет Я работаю над проектом на языке C# (visual studio 2015).
У меня проблема. когда я проигрываю много аудиофайлов один за другим, форма зависает, и я не могу выполнить другую задачу на этой форме, например выбрать другой вариант из поля со списком или даже переместить форму при перетаскивании мыши.
Мои аудиофайлы имеют короткую продолжительность, в среднем от 10 до 20 секунд. Форма зависает во время воспроизведения звука. Перед его запуском размораживается следующая аудиоформа. но это едва ли на одну секунду, а затем снова замирает, потому что он воспроизводит следующий звук.

Вот мой код:

Что я уже пробовал:

<pre>
        private void cmbVerse_SelectedIndexChanged(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = listView1.Items.IndexOf(listView1.SelectedItems[0]);
            int surah = listView1.Items.IndexOf(listView1.SelectedItems[0]) + 1;

            //Load Surah Text file here. i.e. 001.txt
            lines = File.ReadAllLines(@"C:\Users\Sajid Qureshi\Documents\Visual Studio 2015\Projects\First\First\bin\Debug\Resources\" + surah.ToString("000") + ".txt");

            currentIndex = cmbVerse.SelectedIndex;

            richTextBox1.Text = lines[currentIndex];
            mPlayer.URL = Application.StartupPath + "\\Ayaat\\"+(comboBox1.Text).Substring(0,3) + (Int32.Parse(cmbVerse.Text)).ToString("000") + ".mp3";
            mPlayer.Ctlcontrols.play();
            Application.DoEvents();
            Thread.Sleep(TimeSpan.FromSeconds(mPlayer.currentMedia.duration));
            mPlayer.Ctlcontrols.stop();

            if (cmbVerse.SelectedIndex < cmbVerse.Items.Count-1 )
                cmbVerse.SelectedIndex += 1;

        }



Я думаю, что эта линия вызывает проблемы.
Thread.Sleep(TimeSpan.FromSeconds(mPlayer.currentMedia.duration));

но без этого я не могу воспроизводить аудио один за другим.
Пожалуйста помочь

F-ES Sitecore

Вам понадобится какой-то способ узнать, когда звук перестал воспроизводиться, как какое-то событие конца или остановки. Используйте это событие, чтобы начать воспроизведение следующего бита аудио.

2 Ответов

Рейтинг:
14

Jochen Arndt

Никогда не называть Sleep() в вашем основном потоке (потоке графического интерфейса), потому что он блокирует выполнение, как вы уже заметили. Избегайте этого также в рабочих потоках. Использование его - признак плохого дизайна.

Решение заключается в использовании рабочих потоков (которые уже используются внутренне при использовании медиаплеера) и обработке событий.

В вашем случае вы можете использовать Свойство AxWindowsMediaPlayer.playState (Windows)[^] чтобы получить фактическое состояние (например, проверить, следует ли остановить фактически воспроизводимый звук перед воспроизведением нового) и Событие PlayStateChange объекта AxWindowsMediaPlayer (Windows)[^] чтобы получить информацию, когда воспроизведение остановилось в конце (чтобы узнать, когда можно начать воспроизведение другого носителя).

Как и когда использовать эти и другие функции, зависит от того, что вы хотите сделать, когда это должно быть сделано и какие события следует обрабатывать. Определите это в первую очередь и подумайте о том, как это может быть реализовано. Это задача дизайна. Затем прочтите документацию по используемым классам (здесь медиаплеер и связанные с ним классы). Как только это будет сделано, начните реализовывать его, написав код.


Sajid_Qureshi

Большое спасибо. Это сработало. Я изменил свой код соответственно:

Jochen Arndt

Прекрасно, что вы решили эту проблему, и благодарю вас за то, что вы приняли мое решение.

Рейтинг:
0

Sajid_Qureshi

       private void cmbVerse_SelectedIndexChanged(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = listView1.Items.IndexOf(listView1.SelectedItems[0]);
            int surah = listView1.Items.IndexOf(listView1.SelectedItems[0]) + 1;

            //Load Surah Text file here. i.e. 001.txt
            lines = File.ReadAllLines(@"C:\Users\Sajid Qureshi\Documents\Visual Studio 2015\Projects\First\First\bin\Debug\Resources\" + surah.ToString("000") + ".txt");
            label7.Text = lines.Count().ToString();

            currentIndex = cmbVerse.SelectedIndex;
            label7.Text = (comboBox1.Text).Substring(0, 3);
            richTextBox1.Text = lines[currentIndex];
            mPlayer.URL = Application.StartupPath + "\\Ayaat\\"+(comboBox1.Text).Substring(0,3) + (Int32.Parse(cmbVerse.Text)).ToString("000") + ".mp3";
            mPlayer.Ctlcontrols.play();
        }

<pre>        private void mPlayer_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
        {
            // Test the current state of the player and display a message for each state.
            switch (e.newState)
            {
                case 0:    // Undefined
                    currentStateLabel.Text = "Undefined";
                    break;

                case 1:    // Stopped
                    currentStateLabel.Text = "Stopped";
                    if (cmbVerse.SelectedIndex < cmbVerse.Items.Count - 1)
                        cmbVerse.SelectedIndex += 1;
                    break;

                case 2:    // Paused
                :
                :
                :
        }