现在的位置: 首页 > 综合 > 正文

视频压缩管理器(VCM)

2013年08月24日 ⁄ 综合 ⁄ 共 4836字 ⁄ 字号 评论关闭
 

视频压缩管理器(VCM
视频压缩管理器提供了一个访问接口,通过该接口可以使用系统已经安装了的压缩器去压缩处理实时视频数据。应用程序可以使用安装的压缩器去执行下面的任务:
l         压缩和解压视频数据
l         发送一个renderer压缩视频数据并画它显示它。
l         使用应用程序默认的renderers去压缩,解压或者画视频数据。
l         使用renderers 去处理文本和自定义数据。
关于视频压缩管理器
       一般,处理视频图形的压缩器被存放在AVI文件中。通过VCM来访问安装了的压缩器,这些内容涉及到下面的主题:
l         VCM 和VFW的结构
l         从你的程序压缩和解压图形数据
l         从你的程序中使用VCM renderers 去画视频数据
l         VCM 函数和数据结构体
在你阅读这些内容前,最好对Microsoft Win32 图形处理了解一下。因为很多内容,比如位图结构 BITMAPINFO和BITMAPINFOHEADER会大量地被VCM使用。
注意:音频压缩管理器(ACM)提供系统级的音频压缩、解压支持,关于音频压缩服务,可以去看音频压缩管理器。

结构
   VCM界于应用程序和压缩解压缩驱动程序之间。压缩解压缩驱动程序对数据帧进行压缩和解压缩处理。
当应用程序去调用VCM的时候,VCM把这个调用动作封装到一个消息中。然后通过使用ICSendMessage函数,把这个消息发送到适合的压缩器或解压器。VCM接收到压缩器或解压器的返回值后,就把控制返回给应用程序。
       如果为一个消息定义一个宏,这个宏可以对ICSendMessage函数调用进行扩冲,因为它可以为这个消息提供更适合的参数。假如为一个消息定义一个宏,那么你的程序将使用宏而不愿意使用消息。在后面的介绍中,这些宏将放在消息后的园括号中。

压缩,解压缩以及Renderers的注册表项目
系统使用注册表中的“相”来定位VCM的驱动程序。       这些“相”用两个四字符码(two four-character codes)的形式来表示,中间使用一个点来分割(比如VIDC.DIVX)。第一个4字符码(four-character code)由系统定义,它的内容是下列中之一:

四字符码

                 

"VIDC"

压缩器和解压缩器的ID

"VIDS"

视频流Renderers的ID

"TXTS"

文本流(text-stream)Renderers的ID

"AUDS"

音频流控制器

自定义的renderers可以定义它自己的四字符码。

第二个四字符码由驱动程序定义。比较典型的是,第二个四字符码用于描述这个驱动程序可以处理的数据类型。
       当打开一个VCM驱动程序的时候,应用程序就指定了这个驱动程序和驱动程序可以处理的数据类型。一般来说,这个信息来源于数据流的头部。系统将尝试去打开指定的数据,如果打开失败了,系统就在注册表中查找可以处理该数据的其他驱动程序。
       当在查找驱动程序的时候,系统会尝试用与这四字符码匹配的其他驱动程序“项”来处理这个数据类型。例如,一个应用程序指定了一个MSSQ的压缩器,系统在注册表寻找VIDC.MSSQ这个项。如果没有找到,它就打开每个驱动程序去看是否可以处理该数据。在这个例子中,系统在注册表中如果不能找到VIDC.MSSQ“项”,它将打开所有带“VIDC”“相”指定的驱动程序去处理这些数据。

的服务
通常,应用程序使用VCM去处理下面的任务:
l         定位,打开,或安装一个压缩器或者解压器。
l         设置或者获得压缩器、解压缩器的配置信息。
l         使用函数去压缩,解压缩或者显示这些数据。
DrawDib库的函数和宏可以完成完成这些任务,同时它可以提供更方便的方法去使用VCM。关于DrawDib库更多的信息可以,去查看MSDN中DrawDib的内容。
下面将描述使用VCM完成如下的任务:

压缩器和解压缩器基础

       你可以使用ICLocateICOpen函数来打开和定位一个压缩器。你可以是使用ICLocate来定位一个指定类型的压缩器,并通过使用其他VCM函数来获得这个压缩器句柄。要打开一个压缩器,你可以使用ICOpen函数。你的应用程序使用该函数返回的句柄来标示一个打开的压缩器。该压缩器的句柄,在其他VCM函数中会用到。
应用程序使用ICDecompressOpenICDrwaOpen宏来打开和定位一个解压器,这些宏都使用ICLocate操作。
当你的应用程序使用完压缩器和解压器后,必须关闭你打开的解压器和压缩器,同时还要释放到所有用于压缩和解压的资源。你的程序可以使用ICClose函数去关闭压缩器和解压器。
       同样,你的程序通过使用ICInfo函数来列举系统中所有的压缩器和解码器。

注意:在AVI文件的流的头部包含了关于流类型和流指定的处理器的信息。在流的头部内,fccTypefccHandler数据成员指定流的类型和流指定的处理器信息。

用户选择压缩器

当要压缩数据的时候,你的应用程序可以使用ICCompressorChoose函数去创建一个对话框,让用户在对话框中去选择压缩器。你可以给这个函数指定一个标志,来允许用户指定关键帧频率(Key-frame frequency)和运动数据速度(movie-data rate),或者去显示一个预览的窗体。
       ICCompressorChoose函数中,用户选择的压缩器将被自动开,并且压缩器的句柄将保存在COMPVARS数据结构体的hic数据成员中。
       如果你使用了ICCompressorChoose函数,那么使用ICCompressorFree函数去关闭压缩器和释放COMPVARS对象关联的所有资源。

安装和移除压缩器和解压器

       应用程序可以使用系统中已经安装的压缩器后解压器来运行在Microsoft的操作系统上。应用程序同样可以为一般用户或者特殊用户安装压缩器和解压器。大多数的应用程序不需要去安装或者移除压缩起或者解压器,因为它们通常是通过一个安装程序来安装。有的时候,有的函数可以被当作压缩器或者解压器。
   
应用程序通过使用ICInstall函数来安装解压器或者压缩器(或者被当作压缩器或者解压器的函数)。这个函数将在注册表中建立一个“项”去确定压缩器或者解压器。你的应用程序或者其他应用程序可以在查找注册表来确定是否有适合自己使用的解码器和压缩器。使用ICInstall安装压缩器和解压器的所有驱动程序
      
应用程序可以使用ICLocateICOpen函数来定位和打开系统中安装的解压器和压缩器。当应用程序使用完成后,使用ICClose函数来关闭它们。

应用程序使用ICRemove函数,可以在注册表中移除一个已经安装了的压缩器或者解压器的“项”。 该函数不能移除当前已经加载到内存中的压缩器或者解压器。应用程序通过安装,打开,关闭,移除操作可以限定压缩器或解压器的使用。

作为其他选择,应用程序可以使用ICOpenFunction函数,来把一个函数当做压缩器或者解码器来使用,而不需要去注册表进行安装。这个函数要求应用程序获得去进行压缩和解压函数的地址。当应用程序使用完这个函数后,必须使用ICClose来关闭该函数。因为该函数没有在注册表中进行注册,所以不用对注册表进行操作。

    被当做压缩器或者解压器使用的函数的内部结构,与用于安装驱动程序DriverProc指针函数的结构一样。关于DriverPro指针函数的更多信息,你查看MSDN的 Installable Drivers

注意: 应用程序安装了一个可以当作压缩器或解码器的函数,在应用程序关闭前,必须要移出这个函数,好让其他程序不要去尝试使用该函数。当移除这个函数的时候,应用程序把它当作采用四字符码安装的驱动一样。

压缩器和解压器的配置

       你的程序可以自动配置压缩器或者解压器,或者允许用户去配置这些信息。用户可以使用配置对话框来设置压缩器或者解压器的配置信息。你可以发送ICM_CONFIGURE消息给VCM(或者使用ICQueryConfigure宏)来判断压缩器或者解码器是否支持显示配置对话框。如果支持,发送ICM_CONFIGURE消息(ICConfigure宏)来显示它。

       你的程序发送ICM_GETSTATEICM_SETSTATE消息(ICGetStateSizeICGetStateICSetState宏)去获得和设置压缩器、解码器的状态。如果你的程序创建或者改变了状态,必须在恢复它们状态前去获得压缩器或者解码器数据的状态。如果你的应用程序从压缩器或者编码器获得了它们的状态,并将在后面使用它们来恢复以前的状态。要保证你获得的信息为当前的信息。

获得压缩器和编码器的信息

要得到压缩器或者解码器的信息,你可以使用ICGetInfo函数来实现。这个函数把解码器和压缩器的信息写入一个ICINFO的数据结构中。你的程序必须为ICINFO数据结构分配内存,并且在ICGetInfo中通过一个指针指向它。ICINFO数据结构体中将提供很多关于压缩器或者解码器性能的信息。
要获得压缩器或者解码器默认的关键帧频率(key-frame rate)和默认的质量值,可以发送ICM_GETDEFAULTKEYFRAMERATEICM_GETDEFAULTQUALITY消息,或者使用ICGetDefaultKeyFrameRateICGetDafaultQuality宏。
       可以使用ICGetDisplayFormat函数来测量压缩器或解码器最好的显示格式。发送ICM_ABOUT消息可以检测压缩器或解码器是否能显示“关于”对话框。(或使用ICQueryAbout宏)。你同样可以显示压缩器、解码器的这个“关于”对话框,发送ICM_ABOUT消息并改变wParam的参数值(或者使用ICAbout宏)。

单张图像压缩

你可以使用ICImageCompress函数去压缩单张图像。该函数返回一个压缩的DIB位图的句柄。这个压缩的DIB位图使用CF_DIB格式。

序列压缩 (Sequence Compression)

       你的应用程序可以使用ICSeqCompressFrame,ICSeqCompressFrameStartICSeqCompressFrameEnd函数来压缩一个帧的序列。这些函数使用保存在COMPVARS数据结构中的数据。应用程序使用ICCompressorChoose函数允许用户选择一个压缩器,打开它,并在COMPVARS中设置压缩参数;同时,应用程序也可以手动去设置这个数据结构中的参数。
       在应用程序使用开始压缩一个帧序列前,必须使用ICSeqCompressFrameStart去分配必要的资源。在资源分配好后,应用程序就可以是使用ICSeqCompressFrame去压缩每个帧了。帧率(frame rate)和关键帧频率(key-frame frequency)使用COMPVARS数据结构中指定的数去进行压缩。ICSeqCompressFrame的返回值,指向被压缩的数据。
       当程序完成压缩时,可以使用ICSeqCompressFrameEnd函数去释放系统资源(ICSeqCompressFrameStart分配的)。应用程序可以使用ICCompressorFree函数去释放为COMPVARS数据结构分配的系统资源。

图像数据压缩(Image-Data Compression)
       你的程序可以使用一个连串的ICCompress函数和宏去压缩数据。这个函数和宏可以帮你完成下面的任务:

抱歉!评论已关闭.