如何通过C#开发一个媒体播放器(下)-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

如何通过C#开发一个媒体播放器(下)

简介:
  接下来,添加播放/暂停按钮的代码。在代码窗口中,在停止、暂停菜单中单击,然后,在方法名称列表中单击 Click。将以下代码添加到 Visual C# 为您创建的Click 事件处理程序中:

  看看下面的代码是如何实现的:

CleanUp();
m_objFilterGraph = new FilgraphManager();
m_objFilterGraph.RenderFile(openFile
Dialog.FileName);
m_objBasicAudio = m_objFilterGraph as IBasicAudio;
try
{
 m_objVideoWindow = m_objFilterGraph as IVideoWindow;
 
m_objVideoWindow.Owner = (int) panel1.Handle;
 
m_objVideoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN;
 
m_objVideoWindow.SetWindowPosition(panel1.ClientRectangle.Left,
 
panel1.ClientRectangle.Top,
 
panel1.ClientRectangle.Width,
 
panel1.ClientRectangle.Height);
}
catch (Exception ex)
{
 
m_objVideoWindow = null;
}
m_objMediaEvent = m_objFilterGraph as IMediaEvent;
m_objMediaEventEx = m_objFilterGraph as IMediaEventEx;
m_objMediaEventEx.SetNotifyWindow((int) this.Handle, WM_GRAPHNOTIFY, 0);
m_objMediaPosition = m_objFilterGraph as IMediaPosition;
m_objMediaControl = m_objFilterGraph as IMediaControl;

//

如何来播放,暂停,停止
?
简单这些函数看字面也知道
.
//

m_objMediaControl.Run();//
播放

m_objMediaControl.Pause();//
暂停
m_objMediaControl.Stop();//
停止 

// 
这段代码非常简单。当用户单击播放/暂停按钮时,代码将检查 Player  playState 属性。如果 Player 正在播放数字媒体文件,代码就会暂停文件的播放; 如果 Player 已经暂停或停止,代码就再次启动 Player 播放文件。

OK,
在来看我们是如何控制时间进度的?
//

private void timer1_Tick(object sender, System.EventArgs e)
{
 
if (m_CurrentStatus == MediaStatus.Running)
 
{
  
UpdateStatusBar();
 
}
}


  看见上面那个 UpdateStatusBar();这里是让它没100ms更新一次状态栏.

代码如下:

private void UpdateStatusBar()
{
 
switch (m_CurrentStatus)
 
{
  
case MediaStatus.None : statusBarPanel1.Text = "Stopped"; break;
  
case MediaStatus.Paused : statusBarPanel1.Text = "Paused "; break;
  
case MediaStatus.Running: statusBarPanel1.Text = "Running"; break;
  
case MediaStatus.Stopped: statusBarPanel1.Text = "Stopped"; break;
 
}
 
if (m_objMediaPosition != null)
 
{
  
int s = (int) m_objMediaPosition.Duration;
  
int h = s / 3600;
  
int m = (s - (h * 3600)) / 60;
  
s = s - (h * 3600 + m * 60);
  
statusBarPanel2.Text = String.Format("{0:D2}:{1:D2}:{2:D2}", h, m, s);
  
s = (int) m_objMediaPosition.CurrentPosition;
  
h = s / 3600;
  
m = (s - (h * 3600)) / 60;
  
s = s - (h * 3600 + m * 60);
  
statusBarPanel3.Text = String.Format("{0:D2}:{1:D2}:{2:D2}", h, m, s);
 
}
 
else
 
{
  
statusBarPanel2.Text = "00:00:00";
  
statusBarPanel3.Text = "00:00:00";
 
}
}


  还有一个问题程序怎么能够知道它播放完了?

  这会有点麻烦了,想想看有什么办法呢?对了,windows是消息驱动的。那找找看有什么消息。有的就EC_COMPLETE。还记得"WndProc" 它吗?是的,我的老朋友,这次我们必须要改写它来捕获EC_COMPLETE消息。这个消息是DirectShow通知父窗体,播放结束了。

protected override void WndProc(ref Message m)
{
 
if (m.Msg == WM_GRAPHNOTIFY)
 
{
  
int lEventCode;
  
int lParam1, lParam2;
  
while (true)
  
{
   
try
   
{
    
m_objMediaEventEx.GetEvent(out lEventCode,out lParam1,out lParam2,0);
    
m_objMediaEventEx.FreeEventParams(lEventCode, lParam1, lParam2);
    
if (lEventCode == EC_COMPLETE)
    
{
     
m_objMediaControl.Stop();
     
m_objMediaPosition.CurrentPosition = 0;
     
m_CurrentStatus = MediaStatus.Stopped;
     
UpdateStatusBar();
     
UpdateToolBar();
    
}
   
}
   
catch (Exception)
   
{
    
break;
   
}
  
}
 
}
 
base.WndProc(ref m);
}


  只要播放状态改变,上述代码就会运行。如果 Player 正在播放(用户打开文件时就处于播放状态,因为 autoStart设置为 True),代码将启用播放/暂停按钮和停止按钮,以便用户执行操作。之后,代码将播放/暂停按钮的文字更改为暂停,这样用户就可以使用该按钮暂停播放过程。最后,代码检索当前数字媒体文件的标题,并更新标题标签的文字以显示标题。

  如果 Player 被暂停(用户单击了播放/暂停按钮),代码会将播放/暂停按钮的文字更改为播放,以提示用户使用该按钮可以恢复播放。

  如果 Player 被停止(用户单击了停止按钮),代码将禁用停止按钮(因 Player 已经停止工作)并将播放/暂停按钮的文字恢复为默认值播放

  一切都结束了,现在要做的事就是做些来找一部影片来享受一下自己的成果了.

  编写完示例项目的代码之后,您可以生成并运行解决方案。

  生成解决方案

  在 Build(生成)菜单中单击 Build Solution(生成解决方案)。Visual Studio 开始编译并生成项目。如果键入内容全部正确,生成过程将顺利完成,不会出现任何错误。如果生成报告错误,则请检查您的代码并纠正错误。

  使用示例应用程序

  要在调试器中运行项目,请按键盘上的 F5 键。如果出现查看生成的代码主题中介绍的未处理的异常,则应该停止调试会话,删除或注释掉生成代码中的相应行,然后再按 F5 键。

  您可以单击打开查找 .wma  .wmv 文件(究竟选择何种文件,取决于您在打开对话框中选择的文件类型)。选择某个文件并单击确定之后,打开对话框关闭,开始播放数字媒体文件,传输控制按钮的状态也随之改变。这时您就可以利用传输控制按钮来暂停、重新开始或完全停止播放。

 




本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/202830,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章