AXWMP开发手册【与DirectShow比较谈】(转)

AXWMP开发手册
  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控件的面貌。如下图所示:
  


  代码如下: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的块,可以轻松实现播放器的进度栏控制条等。
  播放器界面如下:
  


  右键菜单:
  


  三、AXWMP开发过程中遇到的问题
  (1)如何加入AXWMP控件
  


  如上图所示,选择Visual Studio中的工具菜单,找到“选择工具箱项”打开,找到COM组件中的Windows Media Player,勾上并点击确定,便会在工具箱中出现。然后拖到界面上即可。
  (2)全屏属性
  设置AXWMP实例全屏属性时,要注意加入try{}catch{}。否则会弹出如下错误:
  


  正确代码:
   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的过程如下:
  


  将引用加进去后,在文件顶端添加“using QuartzTypeLib”语句,便可以使用DirectShow各种Filters写播放器了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值