您的位置:首页 > 其它

在windows7的VS2005下windows media player 控件的使用问题

2013-10-23 11:10 176 查看
在windows7的VS2005下windows media player 控件的使用问题

最近做个播放器,用windows7的vs2005想用windows media player控件,网上搜了很多别人的总结,可是没有发现我想要的,因为添加的wmp类以及其接口函数因操作系统不同都会不一样。

下面是别人总结的在vs2005上使用windows media player控件的方法,自己试了下,没有用。。。

最近在做一个有关windows media player 控件的东西,刚开始做的时候,在网上找了很久都没找到相关的中文文档。没办法,只好自己硬着头皮慢慢查看MSDN上的有关内容。由于vs2003与vc6有一定的区别,这也是我在查找资料和使用控件时遇到的具到困难,同时也有很多网友遇到了同样的问题,为了使大家以后在遇到同样问题是能有个比较有帮助的中文说明,小弟就将自己前段时间总结的东西贡献出来,希望对各位有所帮助。

Windows media player作为MS的官方组件,MSDN上有着比较详细的英文说明,但是该说明却并不是那么让人一目了然。该文就如何操作该组件的几个主要接口以及一些基本功能的实现给与详尽而明白的说明,为使该文尽量简单易懂,本文给出了用windows media player控件编写一个简单播放器的基本步骤。

首先,创建一个对话框,然后在资源管理器中右击对话框,选择“插入Active控件”—〉选择windows media player—〉将控件拉到适合大小—〉右击player控件—〉选择添加变量(m_avPlayer)。此时添加的变量在VS2003中不在时IWMPPlay4 了,而是COcx。//附COcx1.h

右击类视图/解决方案—〉添加类—〉选择“Active中的MFC类”—〉选择windows media player<1.0>à选择相应的接口(IWMPMedia IWMPSettings IWMPControls IWMPPlaylist等等)生成类。为图方便,我将所有接口都生成了相应的类。

为了说明方便,我在对话框中放了几个按钮,分别是:打开,播放,暂停,停止,添加。并在对话框右边添加了一个clistctrl又来显示播放列表。

然后在对话框头文件中添加了以下变量:

CWMPControls m_control;

CWMPSettings m_set;

CWMPPlaylist m_playlist;

CWMPMedia m_media;

COcx1 m_avPlayer;

CListCtrl m_listCtrl;

一切准备工作就绪,下面就涉及到具体的编程问题了。

media player 的主要功能有:播放控制,屏幕显示,播放列表,播放列表集,播放信息显示。

l 其中播放控制又有:打开,开始,暂停,停止,快速播放,倒退等等。

1. 打开:当选择一个文件打开是,可以直接使用m_avPlayer.put_URL(fileName);

为打开按钮添加消息响应函数,在函数中添加如下代码:

char szFileFilter[]=

"Mp3 File(*.mp3)|*.mp3|"

"MPEG File(*.mpeg)|*.mpeg|"

"Media File(*.asf)|*.asf|"

"Video File(*.dat)|*.dat|"

"MPGA File(*.mpga)|*.mpga|"

"Wave File(*.wav)|*.wav|"

"AVI File(*.avi)|*.avi|"

"Movie File(*.mov)|*.mov|"

"Mid File(*.mid;*,rmi)|*.mid;*.rmi|"

"Wma File(*.wma)|*.wma|"

"All File(*.*)|*.*||";

CFileDialog fileDialog( TRUE,NULL,NULL,NULL,szFileFilter,this);

if (fileDialog.DoModal() == IDOK)

{

CString fileName=fileDialog.GetPathName();

m_avPlayer.put_URL(fileName);

}

这样当选择一个播放文件后,media player就会自动播放该文件了。

2. 开始:为了实现播放控制,在OnInitDialog()中添加代码:

m_control = static_cast<CWMPControls>(m_avPlayer.get_controls());

然后为开始按钮添加消息响应函数,并在函数中添加代码:

m_control.play();

3. 暂停:m_control.pause();

4. 停止:m_control.stop();

5. 其他如倒退,快速播放,MSDN上有相应的函数,读者可依次自行解决。

到此,一个带有简单播放控制的播放器就完成。

l 下面来实现播放列表。为实现播放列表控制,首先在OnInitDialog()中添加代码:

//创建一个播放列表

m_playlist = static_cast<CWMPPlaylist>(m_avPlayer.get_currentPlaylist());

然后将打开按钮的消息响应函数改为:

char szFileFilter[]=

"Mp3 File(*.mp3)|*.mp3|"

"MPEG File(*.mpeg)|*.mpeg|"

"Media File(*.asf)|*.asf|"

"Video File(*.dat)|*.dat|"

"MPGA File(*.mpga)|*.mpga|"

"Wave File(*.wav)|*.wav|"

"AVI File(*.avi)|*.avi|"

"Movie File(*.mov)|*.mov|"

"Mid File(*.mid;*,rmi)|*.mid;*.rmi|"

"Wma File(*.wma)|*.wma|"

"All File(*.*)|*.*||";

CFileDialog fileDialog( TRUE,NULL,NULL,NULL,szFileFilter,this);

if (fileDialog.DoModal() == IDOK)

{

CString fileName=fileDialog.GetPathName();

//创建一个媒体

m_media = static_cast<CWMPMedia>(m_avPlayer.newMedia(fileName));

//将媒体添加到播放列表

m_playlist.appendItem(m_media);

//将列表添加到当前列表,以便实现自动播放

m_avPlayer.put_currentPlaylist(m_playlist);

m_set = (CWMPSettings)m_avPlayer.get_settings();

//参数true设置自动播放,false不设置自动播放

m_set.put_autoStart(true);

//将媒体的名字添加到列表控件

m_listCtrl.InsertItem(0, m_media.get_name());

}

l 接着是屏幕显示控制

m_avPlayer.put_fullScreen(true/false);

l 使用播放列表自动播放文件,第一步: 需要在播放列表中添加媒体;第二步:将列表设置为当前播放列表;第三步:将播放设置为自动播放。

函数如下:

//创建媒体

m_media = static_cast<CWMPMedia>(m_avPlayer.newMedia(fileName));

//将媒体追加到播放列表

m_playlist.appendItem(m_media);

//将类别设置为当前列表

m_avPlayer.put_currentPlaylist(m_playlist);

//设置自动播放

m_setting.put_autoStart(true);

l 播放信息的显示

可以通过CWMPMedia类获取相关的媒体信息。

获取播放文件名:media.get_name();

l 其他,如鼠标,接盘事件响应,可添加相应的消息响应函数

要注意的是,在添加如鼠标一类的消息时,消息函数有个参数如nButton,它的值为1时是单击鼠标左键,2为单击鼠标右键消息,4为单击鼠标中键。等等。

附COcx1.h

#pragma once

// 计算机生成了由Microsoft Visual C++ 创建的IDispatch 包装类

// 注意: 不要修改此文件的内容。如果此类由

// Microsoft Visual C++ 重新生成,您的修改将被改写。

/////////////////////////////////////////////////////////////////////////////

其实大家的困惑是COcx1.h这个头文件竟然没有操作的具体代码,只要找到了上面这些代码就搞定了

由于尝试在wince(x86)下调用vlc来播放视频未果。所以,寄希望于调用Windows平台下自带的WindowsMediaPlayer(wmp)。因此这两天先尝试下在xp平台下调用wmp。

因为本人并不喜欢mfc,但是项目需要又只能硬着头皮上,这次调用wmp也走了个弯路。因此,这篇文章只起到总结和借鉴的作用。

基本环境:

vs2005

1.所走的弯路

本以为,mfc调用wmp跟调用vlc一样,简单的应用ActiveX插件,进行调用,方便省事。但是,发现其实调用的是wmp的 .ocx控件。这里的Activex插件和ocx控件是有写区别的。参见http://baike.baidu.com/view/393671.htm

因此,开始时,我参阅网上相关的网页操作方法如下:

· 安装WMP9

· VS2005创建mfc工程,名称如MP。

在资源视图中,右键“insert activex control...”,添加Windows Media Player控件。右击控件“add variable...”,指定变量名m_player。这时,你会发现工程中添加了两个文件,分别为:ocx1.h和ocx1.cpp文件。这时发现ocx1.h文件中只有变量的设定,而并没有对应的方法。并且在MPDlg.cpp文件中会有如下:void CMP1Dlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

DDX_Control(pDX, IDC_OCX1, m_player);

}

· 继续按照网上的方法在solution explorer中右击"MP"->"add"->"class...",选择"MFC class From ActiveX Control".选择"registry"单选框,并选择"Windows Media Player<1.0>"。Location:c:\windows\system32\wmp.dll,之后将所有的接口文件加入到工程。

· ......

也许因为wmp版本问题或者其他什么原因,有些人可以通过上面的方法得到想要的结果。但是我没有成功。而下面是我得到正确的方法。

2.可行方法

· 首先将WMP9去除,并注册ocx。方法为:在"开始"-"运行"中:regsvr32 c:\windows\system32\wmp.dll /u ,卸载掉 9.0 版本 WindowsMediaPlayer,然后,在在 PC 机的 [ 开始 ]-[ 运行 ] 里执行以下命令:regsvr32 c:\windows\system32\msdxm.ocx

· VS2005创建mfc工程,名称如MP1。

· 在资源视图中,右键“insert activex control...”,添加Windows Media Player控件。右击控件“add variable...”,指定变量名m_player。这时,你会发现工程中添加了两个文件,分别为:mediaplayer1.h和mediaplayer1.cpp文件。这时发现mediaplayer1.h文件中只有变量的设定,并有对应的方法。并且在MP1Dlg.cpp文件中会有如下:void CMP1Dlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

DDX_Control(pDX, IDC_MEDIAPLAYER1, m_player);

}

· 在solution explorer中右击"MP"->"add"->"class...",选择"MFC class From ActiveX Control".选择"registry"单选框,并选择"Windows Media Player<1.0>"。Location:c:\windows\system32\msdxm.ocx,之后将IMediaPlayer2接口加入到工程。此时工程将出现CMediaPlayer2.h和.cpp文件。如图

· 然后在MP1Dlg.h中将m_player的类替换成CMediaPlayer2。

· 添加按钮:写入代码: char szFileFilter[]=

"Mp3 File(*.mp3)|*.mp3|"

"MPEG File(*.mpeg)|*.mpeg|"

"Media File(*.asf)|*.asf|"

"Video File(*.dat)|*.dat|"

"MPGA File(*.mpga)|*.mpga|"

"Wave File(*.wav)|*.wav|"

"AVI File(*.avi)|*.avi|"

"Movie File(*.mov)|*.mov|"

"Mid File(*.mid;*,rmi)|*.mid;*.rmi|"

"Wma File(*.wma)|*.wma|"

"All File(*.*)|*.*||";

CFileDialog fileDialog( TRUE,NULL,NULL,NULL,szFileFilter,this);

if (fileDialog.DoModal() == IDOK)

{

CString fileName=fileDialog.GetPathName();

fileName.MakeUpper();

m_player.put_FileName(fileName);

}

· 运行。

3.至此,运行的程序就能选择文件并播放,也可以添加其他的功能,这里不多说。有个遗憾是,因为avi格式的压缩可能有多种格式,可能会出现不能播放或者只有声音未见图像的情况。

最后只好把我的工程在别人XP上的vc6.0上打开然后添加控件以及接口函数。

代码:

CFileDialog dlg(TRUE, "asf", NULL, OFN_FILEMUSTEXIST,

"Active Streaming Format(*.asf)|*.asf|"\

"Audio Video Interleave Format(*.avi)|*.avi|"\

"RealAudio/RealVideo(*.rm)|*.rm|"\

"Wave Audio(*.wav)|*.wav|"\

"MIDI File(*.mid)|*.mid|"\

"所有文件(*.*)|*.*||");

if (dlg.DoModal() == IDOK)

{

m_strFileName=dlg.GetPathName();//获取文件路径

m_Play.SetUrl(m_strFileName);//控件载入文件

UpdateData(false);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: