基于DirectShow的MPEG-4视频传输系统的研究与实现

时间:2021-09-16 13:14:42

1 引言

    近年来,随着国民经济的发展,社会各个部门对于视频监视系统的需求越来越多。但目前的很多监视系统都跟具体的硬件相关,必须要具体的采集卡的支持才能实现。所以有必要开发一种具有通用性的视频监视系统,用普通的摄像头就能实现视频的采集。

    基于DirectShow的开发能很灵活地控制音视频的效果,所以选择DirectShow这种可扩展性好的技术做开发对以后的应用升级很有帮助。此外, 为了实现流媒体传输控制的策略,流媒体的传输和回放也是应解决的问题之一。由Microsoft提供的DirectShow技术基于组件对象模型技术,支 持宽松的格式变化,提供高品质的多媒体流回放。利用它可以在普通微机中实现流媒体的客户端处理,并可以提高系统的通用性和可扩展性。

    对于视频数据的传输,压缩率是一个必须考虑到的因素。MPEG-4是由ISO和IEC的MPEG组制定的一个关于活动图像和声音的编码国际标准。它在基于 内容的交互性、压缩率、通用访问能力等方面提供了一系列新的或改进的功能。MPEG-4视频在提供较好的图像质量的同时拥有较高的压缩率,适合于作为传输 的图像压缩标准。




2  相关技术



2.1 DirectShow技术简介

     DirectShow是Microsoft为开发高性能多媒体应用而开发的底层应用程序接口(API),它是DirectX家族的核心成员之一。 DirectShow自身是通过一种系统内置的或程序员开发的过滤器(Filter)来控制和处理多媒体数据的体系结构。该体系结构定义了如何处理和控制 过滤器内部及相互之间的多媒体数据流。每个过滤器都有输入或输出针(Pin), 或两者都有。

    过滤器(Filter)是DirectShow的基本组成部分,是Filter Graph(过滤器图)中最小的功能模块,DirectShow将多媒体数据的处理分离成不同的步骤,这些不同的步骤由相应的Filter去处理。这样我 们可以把不同的过滤器搭配在一起达到我们要求的来处理多媒体数据。过滤器根据实现功能的不同大致可分为3类:

(1) 源过滤器(Source Filters)。源过滤器负责得到原始媒体数据。这些媒体数据的来源包括本地硬盘或网络上的媒体文件、各种采集卡等。

(2) 转换过滤器(Transform Filters)。转换过滤器的任务是处理从其他过滤器中接收的数据,经过一定的处理后再传递给下一个过滤器。编解码器就是典型的转换过滤器。

(3) 表现过滤器(Rendering Filters)。表现过滤器对接收到的数据进行最后的处理。它做的工作有:把媒体数据保存为文件、将数据发送到网络、显示视频、回放音频等[1]。

    在DirectShow 系统之上是应用程序(Application) 。应用程序要按照程序所要实现的功能建立起相应的Filter Graph ,然后借助于Filter Graph Manager 来控制整个数据的处理过程。DirectShow 能在Filter Graph 运行的时候接收到各种事件,并通过消息的方式发送到应用程序。这样就实现了应用程序与DirectShow 系统之间的交互。

2.2 RTP/RTCP协议介绍

    实时传输协议RTP(Realtime Transport Protocol)是针对Internet 上多媒体数据流的一个传输协议,1996 年由IETF( Internet 工程任务组) 的AVT小组作为RFC1889 发布AVT小组后来对该文档进行了不断改进,于2003年7月提出了代替RFC1889的RFC3550。RTP充分体现了应用层分帧这一现代通信协议的 设计思想,允许其用户了解、调整甚至制定连续媒体的打包方案,该协议被广泛用于VoIP、视频等实时媒体的传送。RTP 协议包括RTP
和RTCP(RTP 控制协议) 两个关系十分密切的子协议:

    (1)  RTP协议-传输具有实时特性的数据;

    (2)RTCP协议-监测QoS 和传送参与传输者的信息。

    RTP(实时传输协议) 通常工作在UDP的上层,从上层接收多媒体信息码流(如MPEG-4视频) ,组装成RTP 数据包,然后发送给下层UDP ,相当于OSI 的会话层,提供同步和排序服务。故RTP 协议适用于传送连续性强的数据,如视频、音频等,并对网络引起的时延差错有一定的自适应能力。RTCP 为实时控制协议,用于管理控制信息,如监视网络的延时和带宽,一旦所传输的多媒体信息的带宽发生变化,接收端则通知发送端,广播符号化识别码和编码参数, 达到控制传输质量的目的。此外,如果底层网络支持多点传播的话,RTP
还支持使用多点传播向多个目的端点发送数据。

    RTP协议具有如下特点[5]:

(1)灵活性

    RTP协议的数据报文和控制报文使用不同的端口,数据流和控制流分离,这样大大地提高了协议的灵活性,处理也简单。

(2)支持多播

    如果下层网路支持,可以支持多播。

(3)可扩展性

    RTP协议通常为一个具体的应用提供服务,通过一个具体的应用进程实现,而不作为OSI体系结构中单独的一层来实现,RTP只提供协议框架,开发者可以根据应用的具体要求对协议进行充分的扩展。



3 关键技术的实现



    该系统的发送端实现思路如下:用USB摄像头采集数据,用Divx 5.1.1 Codec 对采集到的数据进行MPEG-4的编码,然后连到一个发送Filter把编码后的数据发送出去。其Filter Graph如图1所示 :

基于DirectShow的MPEG-4视频传输系统的研究与实现

图1   发送端的Filter Graph

   接收端的实现思路如下:通过一个接收Filter接收发送端发送的数据,然后再用Divx Decoder Filter对接收到的数据进行解码。最后用Video Renderer把解码后的数据播放出来。其Filter Graph如图2所示:

基于DirectShow的MPEG-4视频传输系统的研究与实现

图2   接收端的Filter Graph

3.1  数据采集及编码的实现

3.1.1 采集Filter Graph的实现


    采集应用的Filter Graph一般比较复杂,而直接使用Filter Graph Manager上的IGraphBuilder接口构建这种Filter Graph,有时候难度又很大。为此,DirectShow特别提供了一个辅助组件Capture Graph Builder,来简化这种Filter Graph的创建。

    首先是创建Filter Graph Manager 组件,核心代码如下:

基于DirectShow的MPEG-4视频传输系统的研究与实现

3.1.2 加入采集Filter

基于DirectShow的MPEG-4视频传输系统的研究与实现

3.1.3加入MPEG-4编码器Filter

    这里我们采用Divx 提供的开源编码Filter。安装DivX.Pro.v5.1.1后会自动安装Divx的编码器Filter和解码器Filter(注:解码器 Filter在接收端要用到)。在程序中加入Divx的编码器Filter,实现思想是在Video Compressors目录下枚举到名称为"DivX Pro(tm) 5.1.1 Codec"的Filter项后,把它加入到Filter Graph中即可。

3.2 数据的发送和接收

3.2.1 数据的发送Filter的实现
  

    数据的发送要开发一个发送Filter,为了编程上的方便,这里采用程序内Filter的形式来实现。即用类的形式而不是编写一个成一个后缀为ax的组件 注册后再使用。这里我们定义一个继承自CBaseFilter的类CFilterMpeg4Sender。这个类必须实现以下功能[3]:

   (1) 在类中定义CFilterMpeg4Sender上的Pin的实例mInputPin。

   (2) 实现继承自CBaseFilter::GetPin,用于返回Filter上各个Pin的对象指针。

   (3) 实现继承自CBaseFilter::GetPin,用于返回Filter上各个Pin的数量。

    定义一个继承自CRenderedInputPin的类CMpeg4InputPin,用于实现CFilterMpeg4Sender上的输入pin,发送Filter通过该输入pin接收编码Filter输出的数据,然后按一定的规则发送。

    这个类必须实现以下功能[2]:

   (1) 重写方法EndOfStream。

   (2) 实现IPin::BeginFlush和IPin::EndFlush两个函数。

   (3) 重写方法CBasePin::CheckMediaType进行连接时媒体类型的检查。

   (4) 重写方法CBasePin:: Receive(),接收Sample并发送

3.2.2 数据的接收Filter的实现

数 据的接收其实是要编写一个Source Filter, 这个Source Filter名称为CFilterMpeg4Receiver,也继承自CBaseFilter。这跟发送Filter的实现有些类似,有一点需要注意的 是该Filter输出的MediaType的设置。

     Char  MediaType[]=//媒体数据类型,通过在发送端把媒体类型写到一个文件中而得到然后通过语句:CFilterMpeg4Receiver:: SetupMediaType((char *)MediaType,88)设置输出数据的MediaType。

    CFilterMpeg4Receiver::SetupMediaType再调用CMpeg4OutPin::SetupMediaType()设置、接收到的媒体数据的格式,

3.2.3 数据的网络传输的实现

 



     数据的发送我们采用开源代码JRTPLIB【6】提供的RTP协议栈。最新的JRTPLIB对RFC3550的实现进行了封装,开发人员只要初步了解 RTP协议就可以开发出高质量的音视频传输程序。使用JRTPLIB时,只需要通过继承RTPSession类,再重新以下几个函数就可以实现视频数据的 接收。

基于DirectShow的MPEG-4视频传输系统的研究与实现

     在网络带宽比较低的情况下(如十几KBps),数据丢帧现象比较严重,这对于图像质量有很大的影响。我们采用拆帧(拆成1400个字节)以后再发送的方法,来降低丢帧率。接收端收到数据后,再把属于同一视频帧的数据再组起来。

    网络发送接收程序流程图如图3所示:

基于DirectShow的MPEG-4视频传输系统的研究与实现

图3  网络发送接收程序流程图

对程序流程图的说明如下:

(1)发送端拆帧的算法如下:

基于DirectShow的MPEG-4视频传输系统的研究与实现

   然后把属于同一视频帧的数据组好,发送到解码Filter。

   经过测试(在CDMA1.X网络下),采用拆帧方法传输视频数据比直接发送丢包率更低,传输质量有了很大的提高。

3.3 数据解码及回放的实现

    解码Filter使用的是Divx提供的开源解码器,在接收Filter的后面接上该解码Filter即可,最后接上Renderer Filter就可以把接收到的数据回放出来。

3.4 实现帧率控制功能

    通过在采集设备和编码Filter(DivX Pro(tm) 5.1.1 Codec)之间加入一个帧率控制Filter来实现帧率的控制,该Filter相当于一个视频帧数计数器,每接收到一帧,并不立即把该帧发给下游的编码 Filter,而是把计数器的值加1,当计数器的值达到最大值时才把当前收到的帧发出去。在接收端发控制帧率命令给采集端可以很方便的实现帧率的远端控 制。

    程序片断如下:

基于DirectShow的MPEG-4视频传输系统的研究与实现

    加了帧率控制Filter的发送端 Filter Graph 如图4所示:

基于DirectShow的MPEG-4视频传输系统的研究与实现

图4   实现了帧率控制的Filter Graph

4 总结

该系统采用了DirectShow技术实现了MPEG-4视频数据的传输,视频数据的传输采用了RTP协议。而且还实现了远端帧率的控制,该系统可以很方 便的移植到未来3G网络的图像传输系统中。对编解码器进行研究,采用H.264技术实现编解码Filter是下一步要完成的工作,当然在传输质量 (QoS)方面也要深入进行研究。

基于DirectShow的MPEG-4视频传输系统的研究与实现的更多相关文章

  1. VS2010 C++学习(5):基于DirectShow的视频预览录像程序

    VS2010 C++学习(5):基于DirectShow的视频 预览录像程序 学习VC++编制的基于DirectShow视频捕获程序,主要练习基于DirectShow程序的应用. 一.         ...

  2. 【转】实现RTP协议的H.264视频传输系统

    1.  引言       随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡到音频和视频,并越来越强调获取资源的实时性和互动性.但人们又面临着另外一种不可避免的尴尬,就是在网络上看到生动 ...

  3. 转:最简单的基于 DirectShow 的视频播放器

    50行代码实现的一个最简单的基于 DirectShow 的视频播放器 本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectSho ...

  4. 最简单的基于DirectShow的示例:视频播放器自定义版

    ===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...

  5. 最简单的基于DirectShow的示例:视频播放器图形界面版

    ===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...

  6. 最简单的基于DirectShow的示例:视频播放器

    ===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...

  7. 50行代码实现的一个最简单的基于 DirectShow 的视频播放器

    本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectShow 播放视频所有必备的函数. 直接贴上代码,具体代码的含义都写在注释中 ...

  8. 一个简单的基于 DirectShow 的播放器 2(对话框类)

    上篇文章分析了一个封装DirectShow各种接口的封装类(CDXGraph):一个简单的基于 DirectShow 的播放器  1(封装类) 本文继续上篇文章,分析一下调用这个封装类(CDXGrap ...

  9. 一个简单的基于 DirectShow 的播放器 1(封装类)

    DirectShow最主要的功能就是播放视频,在这里介绍一个简单的基于DirectShow的播放器的例子,是用MFC做的,今后有机会可以基于该播放器开发更复杂的播放器软件. 注:该例子取自于<D ...

随机推荐

  1. 电子爱好者DIY篇

    2016/7/15 电子爱好者DIY篇 一年和之前就想到了一些感悟,现在有些模糊的清晰起来了,但还是不够清晰,故写下来做个日志. 结论 首先把结论放在前面.目前随着电子集成电路的发展,电子DIY越来越 ...

  2. 项目中是用eCharts

    1.首先在项目中引入echart.js库. <!DOCTYPE HTML> <%@page contentType="text/html; charset=UTF-8&qu ...

  3. SqlServer 事务回滚&lpar;1&rpar;

    SQL事务   一.事务概念     事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是一个不可分割的工作逻辑单元.在数据库系统上执行并发操作 ...

  4. EWM 强大的数据修复功能

    在上了EWM系统后,运行一段时间可能因为不正确的操作,系统意外情况数据不一致的问题,交货单行项目状态不致,等等报不一致的情况,EWM的自检功能比较强. 下面介绍一种数据不致的修复工具之一,tx: /S ...

  5. netbeans php安装、调试

    文件清单 jdk-8u45-windows-i586_8.0.450.14.1429092020.exe netbeans-8.0.2-php-windows.exe wampserver2.5-Ap ...

  6. Android动画translate坐标图

    X坐标图示: Y坐标图示:

  7. POJ3189 Steady Cow Assignment(最大流)

    题目大概说,有n头牛和b块草地,每头牛心中分别对每块草地都有排名,草地在牛中排名越高牛安排在那的幸福度就越小(...),每块草地都能容纳一定数量的牛.现在要给这n头牛分配草地,牛中的幸福度最大与幸福度 ...

  8. xml格式化成json

    JsonConvert.SerializeObject(model)   XmlDocument doc = new XmlDocument();                    doc.Loa ...

  9. JAVA课程设计

    博客作业教学数据分析系统(From:网络五条狗) 通过网络爬虫技术,将每位同学的分数链接爬到数据库,并根据每位同学该次作业的分数链接,获取该次作业的浏览量.评论量.图片数等信息,接着根据Java班级博 ...

  10. 第四届河南省ACM 表达式求值 栈

    表达式求值 时间限制: 1 Sec  内存限制: 128 MB 提交: 14  解决: 7 [提交][状态][讨论版] 题目描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简 ...