在C#中用DirectShow做的媒体播放机

利用Visual C#开发一个媒体播放器 摘要:了解如何在 Microsoft Visual C# .NET 中使用 DirectShow 控件,如何开发一个媒体播放器。按照本文介绍的操作步骤,您可以创建一个简单 Visual C# 应用程序,用来播放数字音频和视频。    简介  Microsoft Visual C# 是世界上最流行的编程语言,利用 Visual C# 的最新版本 Visual C# .NET, 阅读详情

在C#中用DirectShow做的媒体播放机

概述:
我的这个程序仅仅只是告诉大家如何用DirectShow 在C#中做一个播放机,世上并不能
有太多的功能.也许你只要花上五分种就可以解决问题.是的如果你用的是IDE,我感保证
一切都只是用你的鼠标在你的设计器中点点属性设置一些东西就可以简单的完成了.当然
了还是要那么一点点编码的.至少是关于DirectShow 接口的.例如,视屏和声音.

程序中的小问题:
1.如何从你的磁盘上打开媒体文件
2.如何让工具条上的按钮起用和禁用
3.如何设置状态栏的显示文字
4.如何控制时间
5.如何使用时间控件的事件
6.如何用DirectShow来播放媒体文件
7.如何确定播放状态等等...
...

用户界面如下图:
很简单是吗?是的,我说了是个简单的程序,我只是让它具备了基本功能而已.工具栏上
的三个button控制播放,停止和暂停.一个文件菜单用来打开媒体文件和关闭程序.当然
还有一个介绍程序的Info毫无疑问这是最基本的界面配置.



下面介绍DirectShow 接口

播放视屏和声音文件我们要用到DiectX为我们提供的DirectShow组件.使用这个接口
可以让你方便的播放那些共用的影像和声音文件.你要做的仅仅只是安装DirectShow接口
和使用它的功能函数和配置正确的接口参数而已.


不幸的是.NET并不正式支持DirectX.是的也许你听说DirectX9支持是吗?是的,不过在
最终版敲定的那一天还没来,我们都得不到最好的效果.但无论如何我们还是要用的不是吗?
要不这篇文章得作废了.是的,也许你用过VB,对了,就是它,我们正是要用到那个.

好了,在此之前我们还必须要做件事情.我想你已经猜到了,引用对吗?还记得XCopy吗?是的
.NET的优势.来吧,快点把这个"Interop.QuartzTypeLib.dll"DLL引用进来,就象这样
看见下面的图示了吗?很简单.

最后别忘了看看你的代码中是否有那么一句
using QuartzTypeLib;
有是吗?编译器为你加的,如果没有自己加上好了.

准备工作结束了,该是代码部分了,这可是程序员无法推卸的责任.否则我们都得下岗了.

程序实现部分:

如何打开你想要媒体文件?

还记得吗?"File -> Open..." 是的几乎每个使用windows的人都会这样操作.如何实现?
很简单看看下面的代码:


OpenFileDialog openFileDialog = new OpenFileDialog();

openFileDialog.Filter = "Media Files|*.mpg;*.avi;*.wma;*.mov;*.wav;*.mp2;*.mp3|All Files|*.*";

if (DialogResult.OK == openFileDialog.ShowDialog())
{
    .
    .
    .
看吧很简单是吗?记得写一个函数把它放进去.当你点击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多媒体支持。


图1. DirectShow过滤器树

过滤器
过滤器是注册的DirectShow类,它执行许多媒体信息处理任务。这些任务包括:

获得源信息(例如,获得媒体流)
分析(例如,在流上执行包读入、分离和格式化)
转换(例如,解码WMA和MPEG-4音频和视频流)
渲染(例如,在适当的时候产生音频PCM或者视频RGB/YUV输出,将数据传给DirectSound和DirectDraw)
过滤器使用几种类型的接口,例如引脚、计数器、传送器和时钟接口,来执行它们的任务。过滤器实现和开放了许多接口。FGM可以使用这些接口创建、连接和控制树。过滤器经常实现包含下列方法的IBaseFilter接口:

运行、停止和暂停过滤器状态。
恢复过滤器和厂商信息。
得到和设置参考时钟。
恢复过滤器状态信息。
枚举过滤器引线。
重建过滤器树时定位引脚

好了介绍了这么多,你的手也许已经闲不住了.看看下面的代码是如何实现的


CleanUp();

m_objFilterGraph = new FilgraphManager();
m_objFilterGraph.RenderFile(openFileDialog.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();//停止

 

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);
}
好了,一切都结束了,现在要做的事就是做些来找一部影片来享受一下自己的成果了.

c# DirectShow.dll开发包 该dll用于视频的录制和预览,用于c#语言 立即下载

相关推荐

c# DirectShow打开USB相机拍照

C# 采用DirectShowlib,打开USB相机并拍照。VS2012 完全可用。

【1】C#下的Directshow

因为Directshow是C++的东西,后来为了方便,才有牛人们在C#把directshow重写,但是相关文档很少,所以为了了解DIrectshow ,从C++下的directshow开始是最合理不过的了,但是在C#用不到的知识就基本没有提及了·· 1 基础介绍 部分问题摘录:   DirectShow与ActiveMovie的关系?       Active

一步一脚印 7460

C# WinForm DirectShow视频采集及图片抓取实例DxSnap(绝对源码)

C# WinForm DirectShow视频采集及图片抓取实例DxSnap 抓拍 视频

C#程序中的DirectShow设计

DirectShow设计 1.DirectShow技术简介 DirectShow是DirectX开发包中关于流媒体处理的一个开发包,这个开发包可以进行音频和视频的捕捉,使用它可以开发DVD应用程序和数字TV应用程序。DirectShow支持的媒体文件主要有WMA、MOV、MP

张云博的专栏 1万+

DirectShow视频播放器(C#实现的媒体播放器)

自己用C#写的DirectShow接口实现的媒体播放器,实现了播放、暂停、停止、快进、快退、播放列表、打开文件、将文件夹内所有媒体文件加入播放列表、音量控制、拖动进度条等功能。支持*.mpg;*.avi;*.flv;*.wma;*.mov;*.rmvb;*.asf;*.wav;*.mp2;*.mp3等文件

基于Accord.net的人脸识别与单帧视频捕获 C#项目示例视频捕获代码.zip

基于Accord.net的人脸识别与单帧视频捕获 C#项目示例视频捕获代码

基于AForge、Accord实现C#摄像头画面显示以及视频录制

【代码】基于AForge、Accord实现C#摄像头画面显示以及视频录制。

qq_42945868的博客 1407

Rust Reqwest+Rustls 自签名证书校验

所以这里必须保证reqwest引用的rustls库和本地工程一致。以上就是实现不校验签名的逻辑,后续自己可以在对应回调进行逻辑判断。

bawomingtian123的专栏 1360

c#中用DirectShow实现媒体播放器的核心(1) DirectShow简介

用.net做多媒体开发的似乎不多,所以网上资源也少,看的人更少。不过我的博客上居然还有几位在等新文章的人,有点出乎我的意料了。目前我已不再从事多媒体相关的工作,加入新公司至今都忙到吐血,再加上害怕水平不够误人子弟,所以一直都没有更新这个系列。但是之前有承诺过得着空就一定要更新,现在总算稍微空了那么一点点,继续烂着这个坑的理由就没有了。 DirectShow是微软平台上处理多媒体相关事务...

weixin_30363509的博客 201

从SSTS到CTS:解码汽车电子架构中的需求与实现规范

本文深入解析汽车电子架构中SSTS(子系统功能规范)与CTS(零部件技术规范)的转换过程,揭示从抽象需求到物理实现的关键步骤。通过实际案例说明如何将SSTS的功能逻辑、接口定义和性能指标转化为具体的CTS实施方案,并分享多供应商协同与测试验证的最佳实践,帮助开发者高效完成汽车电子系统开发。

weixin_29201859的博客 500

STM32F407+LAN8720A+LwIP实战:FreeModbus TCP从机功能开发指南

本文详细介绍了基于STM32F407和LAN8720A硬件平台,结合LwIP协议栈实现FreeModbus TCP从机功能的开发指南。内容涵盖硬件连接、LwIP移植、FreeModbus TCP从机实现、任务调度及调试技巧,为工业控制领域的以太网通信开发提供实用参考。

weixin_29190651的博客 547

Microsoft Visual C# .NET 中使用 DirectShow 控件,如何开发一个媒体播放器

摘要:了解如何在 Microsoft Visual C# .NET 中使用 DirectShow 控件,如何开发一个媒体播放器。按照本文介绍的操作步骤,您可以创建一个简单 Visual C# 应用程序,用来播放数字音频和视频。    简介  Microsoft Visual C# 是世界上最流行的编程语言,利用 Visual C# 的最新版本 Visual C# .NET,您能够快速、有效地开发基

2597

microblaze之Video Processing Subsystem调试误区

内容:总结video processing subsystem调试中遇到的问题,以及在解决问题中的思路方法论,引为前车之鉴。 1,我的目的是希望采用vps中的scaler模块对图像进行拉伸缩小。IP的配置如下: 2,整个系统的框架图如下,仅比上期的内容增加了scaler模块,如下: 3,查手册,可以知道这个scaler only组件分成了hscale,vscale和GPIO,其中GPIO是控制上下游stream流控设备复位用,暂时忽略。 hscale和vscale的寄存器空间如下,主要关注图

YDY5659150的专栏 3556

C# DirectShow 播放多媒体

C# DirectShow 播放多媒体 2011年12月01日   要使 C# 代码引用 COM 对象和接口,需要在 C# 内部版本中包含 COM 接口的 .NET 框架定义。完成此操作的最简单方法是使用 TlbImp.exe(类型库导入程序),它是一个包括在 .NET 框架 SDK 中的命令行工具。TlbImp 将 COM 类型库转换为 .NET 框架元数据,从而有效地创建一个可以从任...

ihq357nc 194

本地玩转AI还得靠这个,SillyTavern(酒馆)到底有多强?

SillyTavern是一款本地运行的LLM交互前端,支持文本生成、图像生成、语音合成等功能。它最初是TavernAI的分支,现已独立开发,社区活跃,功能更新频繁。SillyTavern通过前端UI和插件系统连接各种大模型后端,如OpenAI、KoboldAI等,用户可以在本地创建“虚拟酒馆”与各种角色对话。其功能亮点包括角色卡、角色记忆、世界设定、多人聊天室、自定义UI和行为脚本、插件扩展支持等。SillyTavern适合AI创作用户、AI工程师、LLM爱好者和AIGC创作者。它有两个维护分支:relea

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 8043

PyTorch实战(12)——图神经网络(Graph Neural Network,GNN)

在本节中,我们首先简要概述了图神经网络 (Graph Neural Network, GNN) 的核心概念与应用,GNN 通过构建计算图分层聚合节点特征,解决了传统神经网络处理图数据时的四大局限:信息深度不足、节点顺序敏感、动态扩展困难和特征稀疏性问题。了解了不同类型的图学习任务(包括节点级、边级和图级三大类)。接着我们研究了几种流行的 GNN 模型,包括:GCN (通过权重共享实现图卷积)、GAT (引入注意力机制区分邻居重要性)和 GraphSAGE (采用随机采样应对大规模图)。

盼小辉丶的博客 3680

C# 流媒体

9月份前所有问题搞定;10月份进入外贸和业务

aaaaatiger--寻路 4548

Unity零基础到入门 ☀️| 基础知识入门篇章,看完就可以做游戏啦! | 寻找C站宝藏

Unity入门基础知识。本篇文章介绍了关于Unity入门的一些基础知识,包括基本概念和使用实例。简单易上手,轻松实现Unity入门操作!

努力前行,总会成为自己心中的那道光 1万+

[转]C# DirectShow 播放多媒体

要使 C# 代码引用 COM 对象和接口,需要在 C# 内部版本中包含 COM 接口的 .NET 框架定义。完成此操作的最简单方法是使用 TlbImp.exe(类型库导入程序),它是一个包括在 .NET 框架 SDK 中的命令行工具。TlbImp 将 COM 类型库转换为 .NET 框架元数据,从而有效地创建一个可以从任何托管语言调用的托管包装。用 TlbImp 创建的 .NET 框架元数据可以通...

touchinsert 89

Hermes Agent 实战复盘:5 类超预期场景与3 个典型翻车案例分析

揭示 Hermes Agent 在 PDF 智能解析、低代码评审结构化、Kanban 任务驱动执行等五类未被文档覆盖的超预期落地场景,核心依赖 `soul.md`/`CLAUDE.md`/`kanban` 三层上下文建模机制,而非单纯堆 token 或 agent 数量。

weixin_42520239的博客 385

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 理解C#中的代理和事件(二)
下一篇: 使用C#制作的更换桌面背景程序
yarshray
博客等级 码龄25年 72粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值