0

Windows Media Player オーディオの BackgroundWorker プロセスをセットアップするのに助けが必要です。メイン スレッドからではなく、BackgroundWorker から直接オーディオ (WMP) を実行する必要があり、そのバックグラウンド プロセスはオーディオ ファイルの最後まで開いたままにする必要がありますが、PLAY でオーディオが正常に再生され始めても、BackgroundWorker は停止します。 、したがって、すでに閉じられているため、オーディオが実際にその2番目の Thread または backgroundWorker で再生されているとは思いません。

私が持っている質問は、曲の終わりまで開かれたままになる backgroundWorker から Windows Media Player (WMPLib) を使用してこのオーディオ ファイルを再生するにはどうすればよいかということです。

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

バックグラウンドで大量のデータをロードし、メイン UI スレッドの遅延をなくすには、むしろ使用する必要がありますBackgroundWorker(または、できれば非同期 IO API を使用することをお勧めします)。Task.Run次に、UI スレッドで WMP コントロールを作成して使用します。

この方法でコードをリファクタリングできず、WPM のバックグラウンド スレッドを使用したい場合は、そのようなスレッドが Windows メッセージをポンピングする必要があることに注意してください。そうしないと、WPM コントロールが正しく機能しない可能性があります。この目的のために、 my ThreadWithAffinityContextfrom hereを使用できます。

于 2014-04-21T23:54:49.817 に答える