A.S.E.: F.Q.
一、AXWMP开发概述
(1)直接属性
URL, fullScreen, uiMode, Ctlenabled, enableContextMenu, launchURL, playState, stretchToFit, windowlessVideo,
(2)间接属性
Ctlcontrols, settings, currentPlaylist, currentMedia,
(3)其它属性
network, dvd, cdromCollection,
二、AXWMP开发技巧
(1)界面
.uiMode: String; 播放器界面模式,可为full, mini, none, Invisible。
通过设置AXWMP的uiMode来调整AXWMP控件的面貌。如下图所示:
![](http://img18.tianya.cn/photo/2011/3/6/35262380_21562213.jpg)
代码如下:this.myAXWMP.uiMode = "none"; // "mini","full","Invisible"
(2)菜单
采用AXWMP的"none"模式,自己写些菜单,添加相应的函数,就可以得到一个比较好得播放器了。
如何将AXWMP控件自带的右键菜单屏蔽,并加入自己的菜单?代码如下:
this.myWMP.Ctlenabled = false; // 禁用AXWMP控件自带右键菜单
// 添加AXWMP控件鼠标右键单击时响应函数
private void myWMP_ClickEvent(object sender, AxWMPLib._WMPOCXEvents_ClickEvent e)
{
Point pos = Cursor.Position;
if (e.nButton == 2 && !this.myWMP.fullScreen) // 非全屏时右键弹出菜单
{
this.CMS_ RMENU1.Show(pos);
}
if (e.nButton == 2&&this.myWMP.fullScreen) // 全屏时右键弹出菜单
{
this.CMS_ RMENU2.Show(pos);
}
}
(3)缩放
利用C#的panel,将AXWMP控件Dock-fill到panel里面;在Form_Resize里面可以轻松地通过控制panel的缩放,来实现对AXWMP的缩放。
(4)进度
AXWMP的进度栏样式是不能改的。采用"none"模式,结合使用StatusStrip菜单,再加个Slider,用Timer来控制显示Slider的块,可以轻松实现播放器的进度栏控制条等。
播放器界面如下:
![](http://img13.tianya.cn/photo/2011/3/6/35262587_21562213.jpg)
右键菜单:
![](http://img13.tianya.cn/photo/2011/3/6/35262624_21562213.jpg)
三、AXWMP开发过程中遇到的问题
(1)如何加入AXWMP控件
![](http://img13.tianya.cn/photo/2011/3/6/35262668_21562213.jpg)
如上图所示,选择Visual Studio中的工具菜单,找到“选择工具箱项”打开,找到COM组件中的Windows Media Player,勾上并点击确定,便会在工具箱中出现。然后拖到界面上即可。
(2)全屏属性
设置AXWMP实例全屏属性时,要注意加入try{}catch{}。否则会弹出如下错误:
![](http://img17.tianya.cn/photo/2011/3/6/35262711_21562213.jpg)
正确代码:
private void FullScreen_Click(object sender, EventArgs e)
{
try
{
this.myAXWMP.fullScreen = true;
}
catch (Exception ex)
{
MessageBox.Show("没有播放,不能全屏!");
}
}
(3)URL能播放BUF流吗?
URL只支持文件播放,不支持流。
四、AXWMP与QuartzTypeLib.dll(DirectShow)比较
都说DirectShow作的播放器才是真正“自己”写的播放器。其实不然。两者播放的都是文件,也不见得DirectShow能直接播放缓存视频流什么的。需要播放缓存视频流最好的方法还是自己解码。找一些解码函数加进去显示一些也就可以了。
在这个意义上说,用AXWMP控件显得成熟方便多了。它集成了很多东东,如时间条等,都是DirectShow所没有的。DirectShow需要自己编写时间函数,实现缩放需要用到VC之WS_CHILD和WS_CLIPCHILDREN等属性,非熟练者不知道怎么用。至于AXWMP默认支持*.mp3, *.rmvb等等格式就不多了。
虽说DirectShow可以自己添加很多Filter函数,但是在FFDSHOW这个滤镜全集面前,自己写Filter函数显得是很费事了。当然想要自己学习深入者,另算了。
下面是用DirectShow写的播放器,界面与上面的一致。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QuartzTypeLib;
namespace DirectXPlayer
{
public partial class DirectXPlayer : Form
{
private IVideoWindow dxp_win;
private IMediaEvent dxp_evt;
private IMediaEventEx dxp_evt_ex;
private IMediaControl dxp_ctrl;
private IMediaPosition dxp_pos;
private IBasicAudio dxp_aud;
public DirectXPlayer()
{
InitializeComponent();
}
private void Dxp_FormResize(object sender, EventArgs e)
{
this.panel_video.Top = this.ClientRectangle.Top + 25;
this.panel_video.Width = this.ClientRectangle.Width;
this.panel_video.Height = this.ClientRectangle.Height - 25;
this.panel_controllbar.Top = this.panel_video.Bottom;
this.panel_controllbar.Width = this.panel_video.Width;
if(dxp_win!=null) dxp_win.SetWindowPosition(panel_video.ClientRectangle.Left, panel_video.ClientRectangle.Top, panel_video.ClientRectangle.Width, anel_video.ClientRectangle.Height);
}
private void video_play_Click(object sender, EventArgs e)
{ OpenFileDialog dxp_ofd = new OpenFileDialog();
dxp_ofd.Filter = "All Files|*.*";
dxp_ofd.ShowDialog();
if (dxp_ofd.FileName != "" && dxp_win != null)
{
FilgraphManager dxp_fgm = new FilgraphManager();
dxp_fgm.RenderFile(dxp_ofd.FileName);
dxp_aud = dxp_fgm as IBasicAudio;
try
{
dxp_win = dxp_fgm as IVideoWindow;
dxp_win.Owner = (int)panel_video.Handle;
dxp_win.WindowStyle = 0x40000000 | 0x2000000; // WS_CHILD | WS_CLIPCHILDREN;
dxp_win.SetWindowPosition(panel_video.ClientRectangle.Left, panel_video.ClientRectangle.Top, panel_video.ClientRectangle.Width, panel_video.ClientRectangle.Height);
}
catch (Exception ex)
{
dxp_win = null;
MessageBox.Show(ex.Message);
}
dxp_evt = dxp_fgm as IMediaEvent;
dxp_evt_ex = dxp_fgm as IMediaEventEx;
dxp_pos = dxp_fgm as IMediaPosition;
dxp_ctrl = dxp_fgm as IMediaControl;
dxp_ctrl.Run();
}
}
}
}
另外,在Visual C#中加入DirectShow引用库QuartzTypeLib.dll的过程如下:
![](http://img9.tianya.cn/photo/2011/3/6/35262744_21562213.jpg)
将引用加进去后,在文件顶端添加“using QuartzTypeLib”语句,便可以使用DirectShow各种Filters写播放器了。