c# - Windows Media Player的BackgroundWorker进程

标签 c# audio backgroundworker windows-media-player wmplib

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


    }
}

谢谢。

最佳答案

The UI I have it's causing the audio playback to freeze up or stalls when loading big chunks of data inside the same Thread UI, and I would prefer to have that audio process running on a separate thread, that why I though of BackgroundWorker.



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

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

关于c# - Windows Media Player的BackgroundWorker进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23204904/

相关文章:

java - 检测耳机是否已插入Java的耳机插孔中

vb.net - 进度条和代码位置的多线程(vb.net)?

BackgroundWorker 的 C# 问题

用于读取大量文件的 C# 守护进程

c# - 如何修复系统数据 pdb 未加载

c# - 发布后谷歌登录不起作用

javascript - 控制 jquery 音频播放器的 Jquery Slider

c# - 如何在 asp.net mvc 4.0 中将来自相同用户名和密码的用户限制为来自两个系统/浏览器的逻辑?

audio - 为什么phonegap应用程序无法在装有Android 4的Samsung上发出声音?

c# - 在 C# 中通过名称查找后台工作对象