• 休闲生活
  • 教育教学
  • 经济贸易
  • 政法军事
  • 人文社科
  • 农林牧渔
  • 信息科技
  • 建筑房产
  • 环境安全
  • 当前位置: 达达文档网 > 达达文库 > 教育教学 > 正文

    基于DirectShow的DV视频实时采集系统的实现

    时间:2020-09-15 07:50:49 来源:达达文档网 本文已影响 达达文档网手机站

    摘要:随着计算机技术和视频编码技术的发展,现在DV摄像机已越来越多地进入了大众生活,特别是在教育教学中得到了广泛的应用,迫切需要把DV摄像机中的DV数据采集到计算机中进行浏览和处理,为此,笔者在Visual C++ 6.0环境下,运用DirectShow编程技术,编写了一个DV视频实时采集系统,可以实现DV视频的回放和数据的采集,具有良好的实时性、可扩展性。

    关键词:DV;DirectShow;AVI

    中图分类号:TP37文献标识码:A文章编号:1009-3044(2009)24-6768-03

    Realization of Real-time Digital Video Collecting System Based on DirectShow

    XUE Yong

    (Information and Technology Education Center, Jiangsu Teachers University of Technology, Changzhou 213001, China)

    Abstract: With the development of computer technology and video encoding technology, DV vidicons have been more and more popular in people"s daily lives; therefore, it is urgent that the DV data be transferred from DV vidicons to the computer to be browed and processed. For this reason, a real-time DV video collecting system is to be built with DirectShow under Visual C++ 6.0, whose purpose is to realize DV playback and data collecting. The system has a good characteristic of being real time and extendable.

    Key words: DV; DirectShow; AVI

    1 DV技术综述

    DV(Digital Video)是一种专门用来在专用盒式录像带上记录和播放数字视频的压缩格式标准,它是由日本索尼,松下十多个国际性大公司于1996年联合推出,并由国际电信联盟(ITU)批准使用。对于PAL制信号来说,它采用的是4:1:1数字分量编码系统,8bit量化的DCT帧内压缩格式,固定的5:1压缩比,记录码率是25Mb/s,信噪比可达54D。对于音频也提供了优质的PCM数码录音技术。用户可在双声道48kHz取样、16bit量化的DAT音质和四声道、32kHz取样、12bit量化的FM音质两者中进行选择。音频动态范围大于85dB。经过性能检测,DV产品的信号质量远远超过了S_VHS、Hi8,甚至达到专业广播级的水平。

    目前广为流行的DV摄像机就是以这种格式记录视频数据的,这种基于DV技术开发的摄录编设备,以数字化、轻便、易学易用、图像质量高、性价比高等优点成为摄录设备的主导产品。并且越来越多地运用到教育教学活动中,许多教师用他来模拟微格教学,实施技能训练教学、课堂情景化教学、行为化教学、课外辅导等。此外,DV机还可以与闭路电视系统、计算机、多媒体等现代教学媒体联用,并大大延伸他们的功能。

    视频采集是DirectShow除了媒体回放以外的又一基本功能,Filter、COM接口屏蔽了我们对硬件的访问和复杂的采集过程,使用DirectShow SDK快速构建视频捕获应用程序,实现视频的采集和图像的捕获。我们采集视频的目的,一方面直接存盘为一个视频文件;另一方面期望以图像帧的方式,采集RGB/YUV格式数据,对数据做直接处理:滤波、编码、识别等。

    2 DirectShow简介

    DirectShow是DirectX 9.0大家族中的一位成员,它是Microsoft为Windows平台上处理各种格式媒体文件的播放、音视频采集等高性能要求的多媒体应用提供的完整的解决方案。开发多媒体应用要面临很多问题,例如:如何保证多媒体数据处理的高效性;如何让音频和视频同步;如何用简单的方法处理复杂的媒体问题(包括本地文件、计算机网络、广播电视以及其它一些数码电子类产品等);如何处理各种各样的媒体格式问题(包括AVI、ASF、MPEG、MOV等);如何支持目标系统中不可预知的硬件。DirectShow设计的初衷就是尽量让应用程序开发者从复杂的解决数据传输、硬件差异、同步性等问题的工作中解脱出来,总体的应用框架和底层工作由DirectShow来完成,而让开发者把精力专注于具体的多媒体数据的处理上[1]。

    DiredtShow是一个开放性的应用框架,在此框架下,只要遵循COM技术的开发规范,便可以开发出具有各种功能的多媒体应用系统。DirectShow使用一种叫Filter Graph的模型来管理整个数据流的处理过程,参与数据处理的各个功能模块叫做Filter,各个Filte在Filter Graph中按照一定的顺序连成一条“流水线”,协同工作。Filter仅仅是一种功能上的聚合,而Filter Graph就是按照一定的规律将各种Filter结合起来,并且能够实现一定的功能,从软件开发的角度来说,进行DirectShow应用系统从低到高分为三个层次,最低层次是各种不同功能的Filter,中间层是管理着各个Filter组合与动作的Filter Graph,而最高层则是应用程序,也就是最终用户开发的应用程序是通过管理Filter Graph来协调整个系统中封装为Filter的各个功能模块的运作。

    DirectShow9.0对数码摄像机有很好的支持,DV机通过1394接口与计算机相连,支持即插即用。使用DirectShow的工具软件GraphEdit,在“Video Capture Sources”目录下看到一个名为“Microsoft DV Camera and VCR”的Filter,即代表DV机。除了DV机Filter外,DirectShow还提供了一系列相关的Filter来处理DV数据,主要有:DV Splitter(主要用于DV数据的视、音频分离)、DV Video Decoder(负责DV的视频解码)、DV Video Encoder(负责将视频数据编码成DV格式)、DV Muxer(主要将独立的音、视数据合成一个DV流)。

    3 DV视频的实时采集

    在进行DV数据实时采集时。DV数据可以直接保存到AVI文件中。有两种格式,一种格式(Type-1)仍然将音视频按DV原有的交叉格式保存,另一种格式(Type-2)将DV数据的音视频分开后再保存。两种格式各有优缺点:Type-1可以节省CPU的使用时间,适合实时捕捉的场合;而Type-2保持了对VFW的向后兼容性。另外,数码摄像机有两种工作模式:摄像头模式和磁带模式。前者相当于一个摄像头的功能,实时摄取音视频内容,在把DV格式的数据保存到磁带的同时也可以通过1394线把DV数据传给计算机;后者相当于一个放像机,把磁带上的内容显示在摄像机的显示屏的同时也通过1394线把DV数据传给计算机。创建DV视频实时采集程序主要要解决好以下几个问题:1) 如何控制DV摄像机;2) 如何根据不同的应用(比如采集生成的文件类型是Type-1、Type-2或非压缩格式)来构建不同的Filter Graph;3) 如何根据实际情况来改变视频图像的大小和帧率。下面来分别介绍:

    1) DV摄像机的控制:

    这里说的“控制”主要是指:在VCR Mode下,如何控制DV机对磁带的一系列操作(如播放、暂停、快进、快退、停止等);在Camera Mode下,如何执行录像的开始和停止命令。这种控制我们可以通过DV Filter上的IAMExtTransport接口来实现,下面是获得这个接口的代码:

    HRESULT hr;

    IBaseFilter * PDVCam;

    IAMExtTransport * PTransport;

    hr = PDVCam->QueryInterface ( IID_IAMExtTransport, (void **)&PTransport);

    获得该接口后,就可以通过其接口方法put_mode来实现对DV机播放的控制,也可以通过get_mode方法来得到当前的DV机的状态。

    除了IAMExtTransport接口外,还可以利用IAMExtDevice接口来获得DV机当前的工作模式[2]。

    2) 根据不同的应用来构建不同的Filter Graph:

    在编写程序时,我们将所有Filter Graph相关的操作封装在一个CDVCaptureGraph类里面,为了创建磁带播放、磁带录像、DV采集等不同应用场合的Filter Graph,我们定义了一个枚举数据类型DVGRAPH_TYPE,代码如下:

    enum DVGRAPH_TYPE

    {

    GRAPH_PREVIEW, //单纯的预览

    GRAPH_DV_TO_FILE,//DV采集到Type-1文件(同时预览)

    GRAPH_DV_TO_FILE_NOPREW, //DV采集到Type-1文件(没有预览)

    GRAPH_DV_TO_FILE_TYPE2,//DV采集到Type-2文件(同时预览)

    GRAPH_DV_TO_FILE_NOPREW_TYPE2, //DV采集到Type-2文件(没有预览)

    };

    然后对应每一种Filter Graph都有其相应的构建函数,比如Type-1文件(同时预览),我们就用函数代码如下HRESULT BuildDvToFileGraph_Type1(TCHAR * OutputFileName)来完成。在构建每一个具体的Filter Graph时,我们先在GraphEdit中搭建Filter Graph并进行测试,效果满意了,然后再以GraphEdit中的Filter连接图为模板,在应用程序中用程序代码来搭建。将DV视频保存为Type-1类型的AVI文件的Filter Graph如图1所示。在搭建Filter Graph时,程序主要调用了ICaptureGraphBuilder::RenderStream接口方法,函数的实现的主要代码如下:

    m_GraphType = GRAPH_DV_TO_FILE;

    HRESULT hr = S_OK;

    USES_CONVERSION;

    ASSERT(OutputFileName[0]);

    CComPtr ppf;

    CComPtrpSink;

    hr=m_pCaptureGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,

    T2W (OutputFileName), &ppf, &pSink);

    // Routine for changing AVI Mux properties.

    hr = SetAviOptions(ppf, INTERLEAVE_NONE);

    // Connect interleaved stream of Microsoft DV Camera and VCR to the AVI Mux/FW

    hr=m_pCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,

    &MEDIATYPE_Interleaved, m_pDeviceFilter, NULL, ppf);

    // Build a preview graph off of it too

    hr=m_pCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,

    &MEDIATYPE_Interleaved, m_pDeviceFilter, NULL, NULL);

    // Remember to release all interfaces

    3) 根据实际情况来实时改变视频图像的大小:

    DV图像的原始大小,NTSC制式为720*480,PAL制式为720*576,设置大小的方法可以通过两种方法来实现,一是考虑各种不同的应用场合,将DV Video Decoder的属性页显示出来,让用户直接选择。二是通过DV Video Decoder Filter上的IIPDVDec接口来改变DV解码后输出图像的大小。DV Video Decoder仅支持4种不同的输出图像尺寸(具体情况根据信号制式而定),我们一般通过一个枚举变量来表示:

    Enum _DVRESOLUTION{

    DVRESOLUTION_FULL= 1000, // 原始大小

    DVRESOLUTION_HALF=1001,// 宽高都缩小一半

    DVRESOLUTION_QUARTER=1002, // 宽高都缩小为1/4

    DVRESOLUTION_DC=1003 // 宽88,高缩小为1/8

    };

    此时我们可以设置一个变量dvResolution,然后根据欲设置的图像尺寸,取出上面四个尺寸中的一个值赋予dvResolution,接着就可以调用IIPDVDec接口中的put_IPDisplay方法来设置图像大小,主要代码如下:

    IBaseFilter * pFilter = mDVVideoDecoder->GetFilter();

    if(pFilter)

    { IIPDVDec * pIPDVDec = NULL; // 在DV Video Decoder上获得IIPDVDec接口

    pFilter->QueryInterface(IID_IIPDVDec,(void**)&pIPDVDec);

    if(pIPDVDec)

    { pIPDVDec->Release();

    pIPDVDec->put_IPDisplay(dvReaolution);}}

    4 结束语

    试验结果表明,运用DirectShow技术来开发的DV视频采集系统,抓取帧的质量高,速度快,并且具有更大的灵活性、更好的可移植性和更高的稳定性,并且开发调试更为简便,明显缩短了开发周期。

    参考文献:

    [1] 陆其明.DirectShow开发指南[M].北京:清华大学出版社,2003:1-3.

    [2] 刘祎玮.Visual C++视频/音频开发实用工程案例精选[M].北京:人民邮电出版社,2004:319-320.

    [3] 陆其明.DirectShow务实精选[M].北京:科学出版社,2004:117.

    相关热词搜索: 实时 采集系统 视频 DirectShow DV

    • 生活居家
    • 情感人生
    • 社会财经
    • 文化
    • 职场
    • 教育
    • 电脑上网