如何通过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,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
物联网 数据处理 C#
C#实现上位机开发,串口通信,读写串口数据并处理16进制数据
C#实现上位机开发,串口通信,读写串口数据并处理16进制数据。在自动化、物联网以及工业控制行业中,上位机开发是一项重要的技能。本教程主要介绍使用C#进行上位机开发,重点在于串口通信和数据处理。
274 82
|
3月前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
101 12
|
4月前
|
前端开发 JavaScript 安全
C#一分钟浅谈:Blazor WebAssembly 开发
Blazor WebAssembly 是一个客户端框架,允许开发者使用C#和Razor语法构建Web应用。本文介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,包括路由配置、数据绑定、异步操作、状态管理和性能优化等方面的内容,并分享了一些易错点及如何避免的方法。希望这些内容能帮助你在Blazor WebAssembly开发中少走弯路,提高开发效率。
166 51
|
4月前
|
缓存 C# 开发者
C# 一分钟浅谈:Blazor Server 端开发
本文介绍了 Blazor Server,一种基于 .NET 的 Web 开发模型,允许使用 C# 和 Razor 语法构建交互式 Web 应用。文章从基础概念、创建应用、常见问题及解决方案、易错点及避免方法等方面详细讲解,帮助开发者快速上手并提高开发效率。
106 2
|
4月前
|
开发框架 缓存 .NET
C# 一分钟浅谈:Blazor Server 端开发
Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
219 1
|
4月前
|
测试技术 Go C#
C#一分钟浅谈:ReSharper 插件增强开发效率
【10月更文挑战第25天】ReSharper 是 JetBrains 开发的一款 Visual Studio 插件,旨在提高 .NET 开发者的生产力。它通过代码分析、重构、导航等功能,帮助开发者避免常见错误,提升代码质量和开发效率。本文将通过具体代码案例,详细介绍 ReSharper 的常见功能及其应用。
110 1
|
4月前
|
C# Python
使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
【10月更文挑战第30天】使用 `wxPython` 开发跨平台桌面应用时,可以通过创建辅助类来模拟 C# 扩展函数的功能。具体步骤包括:1. 创建辅助类 `WxWidgetHelpers`;2. 在该类中定义静态方法,如 `set_button_color`;3. 在应用中调用这些方法。这种方法提高了代码的可读性和可维护性,无需修改 `wxPython` 库即可为控件添加自定义功能。但需要注意显式调用方法和避免命名冲突。
|
5月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
66 1
|
5月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
102 1
|
5月前
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
254 0