WMP与连续播放
2008-08-14 15:24:31| 分类:
dotnet
| 标签:
|举报
|字号大中小 订阅
怎样用AxWindowsMediaPlayer控件实现连续播放,本来这是一件很简单的事,用播放列表,然后设置播放模式就成了。很简单的。然而,现在有些顾虑,不能命名用播放列表,至少不能完全依赖于播放列表。
只得曲线救国了。
实现过程蛮复杂,就是代码比较分散,难以维护。
一、在Load时,wmp.settings.setMode("shuffle", false);设置顺序播放
二、双击播放列表时:
private void mt1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
//如果不是文件结点则退出
if (e.Node.Tag == null) return;
string file = e.Node.Tag.ToString();
if (!File.Exists(file)) return;
currentTreeNode = e.Node;
this.Text = AppConfig.GetInstance().App.Name + "---" + currentTreeNode.Text;
wmp.Ctlcontrols.currentPosition = AppConfig.GetInstance().Play.Start;
WMPLib.IWMPMedia media = wmp.newMedia(file);
wmp.currentPlaylist.clear(); //一定要清空,不然结果不可预测(想不通啊。)
wmp.currentPlaylist.appendItem(media);
wmp.Ctlcontrols.next(); //这儿不能用Play(),不然结果也不奇怪。
}
三、在PlayStateChange发生时:
private void wmp_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
WMPLib.WMPPlayState state = (WMPLib.WMPPlayState)e.newState;
//解决双击媒体后还不能马上播放的问题
if (state == WMPLib.WMPPlayState.wmppsReady) wmp.Ctlcontrols.play();
//在当前媒体播放完毕后播放下一首
if (state == WMPLib.WMPPlayState.wmppsMediaEnded)
{
if (currentTreeNode != null && currentTreeNode.NextNode != null)
{
currentTreeNode = currentTreeNode.NextNode;
if (currentTreeNode.Tag == null) return; //不是一个媒体
string file = currentTreeNode.Tag.ToString();
if (!File.Exists(file)) return; //文件不存在时
this.Text = AppConfig.GetInstance().App.Name + "---" + currentTreeNode.Text;
WMPLib.IWMPMedia media = wmp.newMedia(file);
wmp.currentPlaylist.appendItem(media);
}
}
System.Diagnostics.Debug.Print(state.ToString());
}
费了十龙十象之力(龙象般若神功),总算把这个问题摸索着解决了。实在是有用的资料太少了。全靠摸索。这个方法很好啦。比起同时维护两份播放列表要舒服得多了。
这儿的办法是:在当前媒体播放完毕后就将下一个媒体加入到当前播放列表中去,这样,WMP内核会自动尝试加载下一个媒体文件并播放它。当然前提供是设置了“顺序播放”。。。
后记:一个人的摸索太难了。太考验人的耐心了。到目前为止,这个播放器该有的功能差不多都有了,关于播放列表的查找功能,因为实在没地方摆界面,还没有来得及做。代码在不少地方可能存在冗余,有待重构。
评论这张
转发至微博
转发至微博
评论