利用VisualC开发一个媒体播放器节能
民生救助 2020-10-09 03:00 字号: 大 中 小
开发应用程序
创建通过 PIA 与 Framework 连接的 Player 控件实例之后,您可以向窗体中添加所需的其他元素,并编写完成实际操作的代码。
添加 Windows 窗体控件
1. 在 View(视图)菜单中,单击 Designer(设计器),或者单击 Solution Explorer(解决方案资源管理器)中的 View Designer(视图设计器)按钮,切换到窗体设计器。
2. 在窗体上增加文件、播放、信息等菜单。
3. 在工具箱的 Windows Forms(Windows 窗体)面板中,为您的窗体添加一个工具栏、一个状态栏和图片imageList。
4. 在 Properties(属性)窗口中,将工具栏的名称更改为 toolBar1,将在Buttons上增加4个按钮。状态栏的名称更改为 statusBar1,并分别增加三个Panel。
5. 在工具箱的面板中,为您的窗体添加一个面版panel1。
6. 增加一个定时器timer1。
7. 调整控件在窗体中的排列方式,使之符合您的需要而且方便用户使用。下图为 Visual Studio Designer(设计器)中完成后的窗体布局。
图 3
编写代码
如何打开你想要媒体文件?
第一步是编写在 frmPlayMedia中打开 Windows Media 文件的代码。要自动切换到 Code(代码)视图并打开菜单的 Click 事件处理程序 (menuItem2_Click) 的代码,请双击窗体上的“工具栏”按钮。将以下代码添加到事件处理程序中:
还记得吗"文件 - 打开..." 是的几乎每个使用windows的人都会这样操作.如何实现?
很简单看看下面的代码:
OpenFileDialog openFileDialog = new OpenFileDialog();
lter = "Media Files|*.mpg;*.avi;*.wma;*.mov;*.wav;*.mp2;*.mp3|All Files|*.*";
if ( == owDialog())
{
….
}
看吧很简单是吗?记得写一个函数把它放进去。当你点击OK按钮的时候,DirectShow接口就会得到你想要播放的文件。下图解释了它是如何工作的。
DirectShow为多媒体流回放提供最基本的服务,这些多媒体流可以是本地文件,还可以是服务器传输过来的。特别的,DirectShow可以支持视频回放,支持以不同的文件和流格式压缩视频内容,包括Windows Media、MPEG、AVI和WAV。
在DirectShow的核心处,服务是组件的模块化集合,称为过滤器,可以根据媒体类型排列成过滤器图。过滤器可以操作数据流,如读入、分析、解码、格式化或渲染。
过滤器以树型进行排列,这棵树称为过滤器树,通过过滤器树管理器(Filter Graph Manager,简称FGM)进行管理。使用FGM应用程序可以通过使用Microsoft Windows Media Player控件间接控制过滤器树,还可以通过调用COM接口方法直接控制。DirectShow过滤器树(参阅图1)由从源到目标渲染器的有向过滤器序列组成,所有这些通过输入和输出过滤器引脚连接。过滤器引脚协商它们将支持哪些媒体类型。FGM控制树过滤器之间的多媒体数据流。因为DirectShow有一个灵活的、可重配置的过滤器树体系结构,因此DirectShow可以使用同样的软件成分支持多种媒体类型的回放和分流。开发人员还可以通过编写自己的过滤器扩展DirectShow多媒体支持。
过滤器
过滤器是注册的DirectShow类,它执行许多媒体信息处理任务。这些任务包括:
获得源信息(例如,获得媒体流)
分析(例如,在流上执行包读入、分离和格式化)
转换(例如,解码WMA和MPEG-4音频和视频流)
渲染(例如,在适当的时候产生音频PCM或者视频RGB/YUV输出,将数据传给DirectSound和DirectDraw)
过滤器使用几种类型的接口,例如引脚、计数器、传送器和时钟接口,来执行它们的任务。过滤器实现和开放了许多接口。FGM可以使用这些接口创建、连接和控制树。过滤器经常实现包含下列方法的IBaseFilter接口:
运行、停止和暂停过滤器状态。
恢复过滤器和厂商信息。
得到和设置参考时钟。
恢复过滤器状态信息。
枚举过滤器引线。
重建过滤器树时定位引脚
用户单击“打开”时,这段代码将显示一个对话框,供用户在计算机上浏览并选择要播放的 .wma 或 .wmv 文件。用户选择文件(并单击“确定”)时,代码将 Player 的 URL 属性设置为用户选择的文件。由于 Player 的 autoStart 属性在默认情况下设置为 True,所以 Player 立即打开并播放用户选择的数字媒体文件。
接下来,添加播放/暂停按钮的代码。在代码窗口中,在停止、暂停菜单中单击,然后,在方法名称列表中单击 Click。将以下代码添加到 Visual C# 为您创建的Click 事件处理程序中:
看看下面的代码是如何实现的:
CleanUp();
m_objFilterGraph = new FilgraphManager();
m_nderFile(leName);
m_objBasicAudio = m_objFilterGraph as IBasicAudio;
try
{
m_objVideoWindow = m_objFilterGraph as IVideoWindow;
m_ner = (int) ndle;
m_ndowStyle = WS_CHILD | WS_CLIPCHILDREN;
m_tWindowPosition(ft,
p,
dth,
ight);
}
catch (Exception ex)
{
m_objVideoWindow = null;
}
m_objMediaEvent = m_objFilterGraph as IMediaEvent;
m_objMediaEventEx = m_objFilterGraph as IMediaEventEx;
m_tNotifyWindow((int) ndle, WM_GRAPHNOTIFY, 0);
m_objMediaPosition = m_objFilterGraph as IMediaPosition;
m_objMediaControl = m_objFilterGraph as IMediaControl;
//
如何来播放,暂停,停止?
简单这些函数看字面也知道.
//
m_n();//播放
m_use();//暂停
m_op();//停止
// 这段代码非常简单。当用户单击播放/暂停按钮时,代码将检查 Player 的 playState 属性。如果 Player 正在播放数字媒体文件,代码就会暂停文件的播放; 如果 Player 已经暂停或停止,代码就再次启动 Player 播放文件。
OK,在来看我们是如何控制时间进度的?
//
private void timer1_Tick(object sender, entArgs e)
{
if (m_CurrentStatus == nning)
{
UpdateStatusBar();
}
}
看见上面那个 UpdateStatusBar();这里是让它没100ms更新一次状态栏.
代码如下:
private void UpdateStatusBar()
{
switch (m_CurrentStatus)
{
case ne : xt = "Stopped"; break;
case used : xt = "Paused "; break;
case nning: xt = "Running"; break;
case opped: xt = "Stopped"; break;
}
if (m_objMediaPosition != null)
{
int s = (int) m_ration;
int h = s / 3600;
int m = (s - (h * 3600)) / 60;
s = s - (h * 3600 + m * 60);
xt = rmat("{0:D2}:{1:D2}:{2:D2}", h, m, s);
s = (int) m_rrentPosition;
h = s / 3600;
m = (s - (h * 3600)) / 60;
s = s - (h * 3600 + m * 60);
xt = rmat("{0:D2}:{1:D2}:{2:D2}", h, m, s);
}
else
{
xt = "00:00:00";
xt = "00:00:00";
}
}
还有一个问题程序怎么能够知道它播放完了?
这会有点麻烦了,想想看有什么办法呢?对了,windows是消息驱动的。那找找看有什么消息。有的就EC_COMPLETE。还记得"WndProc" 它吗?是的,我的老朋友,这次我们必须要改写它来捕获EC_COMPLETE消息。这个消息是DirectShow通知父窗体,播放结束了。
protected override void WndProc(ref Message m)
{
if (g == WM_GRAPHNOTIFY)
{
int lEventCode;
int lParam1, lParam2;
while (true)
{
try
{
m_tEvent(out lEventCode,out lParam1,out lParam2,0);
m_eeEventParams(lEventCode, lParam1, lParam2);
if (lEventCode == EC_COMPLETE)
{
m_op();
m_rrentPosition = 0;
m_CurrentSt让人才有用武之地、无后顾之忧。充分发挥政府部门的“推手”作用atus = opped;
UpdateStatusBar();
UpdateToolBar();
}
}
catch (Exception)
{
break;
}
}
}
dProc(ref m);
}
只要播放状态改变,上述代码就会运行。如果 Player 正在播放(用户打开文件时就处于播放状态,因为 autoStart 设置为 True),代码将启用播放/暂停按钮和停止按钮,以便用户执行操作。之后,代码将播放/暂停按钮的文字更改为“暂停”,这样用户就可以使用该按钮暂停播放过程。最后,代码检索当前数字媒体文件的标题,并更新标题标签的文字以显示标题。
如果 Player 被暂停(用户单击了播放/暂停按钮),代码会将播放/暂停按钮的文字更改为“播放”,以提示用户使用该按钮可以恢复播放。
如果 Player 被停止(用户单击了停止按钮),代码将禁用停止按钮(因 Player 已经停止工作)并将播放/暂停按钮的文字恢复为默认值“播放”。
一切都结束了,现在要做的事就是做些来找一部影片来享受一下自己的成果了.
编写完示例项目的代码之后,您可以生成并运行解决方案。
生成解决方案
在 Build(生成)菜单中单击 Build Solution(生成解决方案)。Visual Studio 开始编译并生成项目。如果键入内容全部正确,生成过程将顺利完成,不会出现任何错误。如果生成报告错误,则请检查您的代码并纠正错误。
使用示例应用程序
要在调试器中运行项目,请按键盘上的 F5 键。如果出现“查看生成的代码”主题中介绍的未处理的异常,则应该停止调试会话,删除或注释掉生成代码中的相应行,然后再按 F5 键。
您可以单击“打开”查找 .wma 或 .wmv 文件(究竟选择何种文件,取决于您在“打开”对话框中选择的文件类型)。选择某个文件并单击“确定”之后,“打开”对话框关闭,开始播放数字媒体文件,传输控制按钮的状态也随之改变。这时您就可以利用传输控制按钮来暂停、重新开始或完全停止播放。查看本文来源
连云港牛皮癣治疗方法茶叶招商加盟陇南哪家医院治疗白癜风-
-
海南楼市淡季加速出岛营销加速出货或成主旋搭配
海南楼市淡季加速出岛营销 加速出货或成主旋律进入今年以来...
2020-05-31 | 民生救助
-
-
最新MVP排行榜字母哥升至榜首库里紧随其搭配
最新MVP排行榜:字母哥升至榜首 库里紧随其后字母哥升至首位...
2020-05-27 | 民生救助
-
-
浙江建筑业全面实施按月足额支付工资
浙江:建筑业全面实施按月足额支付工资 新华社杭州9月...
2019-12-17 | 民生救助
-
-
扎实开展消防工作法治维安年活动
扎实开展消防工作“法治维安年”活动4月11日下午,全区2017年...
2019-12-17 | 民生救助
-
-
别拿电视问政来作秀
别拿“电视问政”来作秀回答的局长,不要搞大话、空话、套...
2019-07-13 | 民生救助
-
-
日通乡认真贯彻落实上级文件精神
日通乡认真贯彻落实上级文件精神本消息 6月16日,卡若区召开...
2019-07-13 | 民生救助