【问题标题】:How to play next item on playlist with axmediaplayer?如何使用 axmediaplayer 播放播放列表中的下一个项目?
【发布时间】:2012-02-03 14:58:59
【问题描述】:

好的,我有问题,我制作了这段代码来根据列表框中列出的项目播放 axmediaplayer。 首先,我使用 opendialog 制作此代码以制作列表:

 private string[] files, path;
 private void button1_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            files = openFileDialog1.SafeFileNames;
            path = openFileDialog1.FileNames;
            for (int i = 0; i < files.Length; i++) {
                listBox1.Items.Add(files[i]);
            }
        }
    }

然后它会在列表框索引发生变化时播放音乐(当列表框上的项目单击时)使用此代码:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    axWindowsMediaPlayer1.URL = path[listBox1.SelectedIndex];
}

它工作正常,然后我希望播放器根据我列表框中的项目自动移动到下一首歌曲。使用事件 PlayStateChange,所以我制作了这段代码

private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
    if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded) 
    {
         if(listBox1.SelectedIndex < files.Length - 1)
         {
            listBox1.SelectedIndex = listBox1.SelectedIndex + 1;
         }
    }
}

所选索引发生变化,但播放器不会自动播放下一首歌曲。我必须手动单击播放按钮才能播放列表。谁能帮帮我?

【问题讨论】:

  • 您选择的项目在列表框中的哪个位置..?您必须从多少个 URL 中进行选择。如果您单击列表中的最后一个 URL,会发生什么情况。您会收到错误信息吗?如果你正在检查 e.newState 你也能得到一个 e.SeletedItem 它的索引 listBox1.SelectedIndex = e.SelectedIndex;
  • @Scott - 感谢您的推荐,我使用 opendialog 获取列表框项目,然后将结果转换为数组路径(也许我还必须写下如何获取列表框?)。是的,当最后一个列表被选中时它崩溃了我知道这是因为当你点击最后一个列表时 + 1 你没有什么可玩的。我不确定你最后一个问题是什么意思
  • 只修复最后一个代码,现在当列表命中最后一项时它不会崩溃。
  • 我发现了一些东西,当我检查我的 if 语句时,我使用 mbox 来检查语句是否触发(我将 mbox 放在 listBox1.SelectedIndex = listBox1.SelectedIndex + 1;)所以如果语句fire my mbox 会弹出。当歌曲结束时它会弹出,然后发生一些事情,下一首歌曲就像我想要的那样播放,但是当我关闭 mbox 时它又停止了。奇怪-_-
  • 你确定你没有任何其他可能触发某些事件的连接事件.. 还有任何设置是你的媒体代码中的 MediaPlayer 将被设置对于诸如随机播放、随机播放、预览或确定其他事件是否会暂停媒体播放器之类的东西??

标签: c# axwindowsmediaplayer


【解决方案1】:

好的,我找到了,解决方案是在播放下一首歌曲之前添加计时器。 首先我添加了计时器,应该是 timer1。然后我将 playstate 事件更改为这样的:

private void axWindowsMediaPlayer1_PlayStateChange(object sender, axWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
    {
        if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
        {
            timer1.Interval = 100;
            timer1.Enabled = true;               
        }            
     }

然后在我添加滴答事件的计时器上,滴答事件是这样的:

 private void timer1_Tick(object sender, EventArgs e)
    {
        if (listBox1.SelectedIndex < files.Length - 1)
        {
            listBox1.SelectedIndex++;
            timer1.Enabled = false;
        }
        else
        {
            listBox1.SelectedIndex = 0;
            timer1.Enabled = false;
        }            
    }       

现在它工作正常^^

【讨论】:

    【解决方案2】:

    以下功能对我有用

        private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
        {
            if ((WMPLib.WMPPlayState)e.newState == WMPLib.WMPPlayState.wmppsMediaEnded)
            {
    
                timer1.Interval = 100;
                timer1.Start();
                timer1.Enabled = true;   
                timer1.Tick += timer1_Tick;
            }
        }
    
        private void timer1_Tick(object sender, EventArgs e)
        {
            /// method to play video list items
            myFuntiontoPlayVideo();
            timer1.Enabled = false;
        }     
    

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 2016-08-17
      相关资源
      最近更新 更多