0

我需要一些帮助来设置 Windows Media Player 音频的 BackgroundWorker 进程。我需要直接从 BackgroundWorker 运行音频(WMP),而不是从主线程,并且该后台进程需要保持打开状态直到音频文件结束,但即使音频在 PLAY 上开始正常播放,BackgroundWorker 也会停止,因此我认为音频实际上并没有在第二个线程或 backgroundWorker 上播放,因为它已经关闭。

我的问题是,如何使用 Windows Media Player (WMPLib) 从 backgroundWorker 播放此音频文件,该文件将保持打开状态直到歌曲结束?

using WMPLib;

namespace mediaplayer
{

    public partial class MainWindow : Window
    {

        BackgroundWorker m_audioProcessingWorker;


        public MainWindow()
        {
            InitializeComponent();            
        }
        string filename = @"C:\audio\song1.mp3"


        private void button_play_Click(object sender, EventArgs e)
        {
           // Create the Audio Processing Worker (Thread)
           m_audioProcessingWorker = new BackgroundWorker();
           m_audioProcessingWorker.DoWork += new DoWorkEventHandler(audioProcessingWorker_DoWork);
           m_audioProcessingWorker.RunWorkerAsync();
           m_audioProcessingWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(audioProcessingWorker_Completed);
        }


        private void audioProcessingWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            try
              {
               axWindowsMediaPlayer1.URL = filename;
               axWindowsMediaPlayer1.Ctlcontrols.play();
              }
            catch (Exception ex)
              {
                 MessageBox.Show(ex.Message);
              }

        }

        private void audioProcessingWorker_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("Audio is finished");

        }


        private void button_stop_Click(object sender, EventArgs e)
        {

            axWindowsMediaPlayer1.Ctlcontrols.stop();
            m_audioProcessingWorker.CancelAsync();
        }

        private void button_pause_Click(object sender, EventArgs e)
        {
            axWindowsMediaPlayer1.Ctlcontrols.pause();
        }


    }
}

谢谢。

4

1 回答 1

0

当在同一个线程 UI 中加载大块数据时,我拥有的 UI 会导致音频播放冻结或停止,我希望该音频进程在单独的线程上运行,这就是为什么我想到BackgroundWorker.

您应该使用BackgroundWorker(或者更好,Task.Run或者自然是异步 IO API)在后台加载大块数据并保持主 UI 线程无延迟。然后在 UI 线程上创建并使用 WMP 控件。

如果您不能以这种方式重构代码并希望为 WPM 使用后台线程,请记住这样的线程必须泵送 Windows 消息,否则 WPM 控件可能无法正常运行。为此,您可以使用 my ThreadWithAffinityContextfrom here

于 2014-04-21T23:54:49.817 回答