设置(Profile)
一个设置是一个ASF的配置(configuration)的描述数据集合。一个设置必须至少包含一个流的配置设置。
流信息
设置中的流信息包含流的比特率(bit rate),缓冲窗口和媒体属性的设置。视频和音频的流信息准确描述了文件中的媒体配置,包括压缩数据使用的编码和解码器(如果有的话)。
一个设置也包含很多创建ASF文件时使用的ASF的特性,这包括互斥、媒体优先级、带宽共享和数据单位扩展。
每次写文件时必须提供设置。你可以调用IWMWriter::SetProfile指定一个设置。
设置有三种形式,应用程序中设置对象包含的数据,XML文件,或者ASF文件头。
设置对象
可以用设置管理器创建空设置对象,然后从现有数据载入设置
XML文件
具有PRX扩展名.注意Windows Media 9 Series 中没有原来的系统设置(system profiles)也不再使用,而作为这种形式存在。保存自定义设置时必须保存成这种文件。
ASF文件头
ASF读者创建一个设置对象,然后从ASF文件头载入格式信息。但是修改文件头不会影响文件的内容。可以重新对文件编码来完成格式的修改。
使用设置编辑器
除了用Windows Media Format SDK之外,还可以用Windows Media Encoder 9 Series中包含的设置编辑器创建设置。在应用程序中使用IWMProfileManager::LoadProfileByData载入预定义的设置。但是,启用“视频大小:和输入相同”这个选项将设置视频的大小为0;Windows Media Encoder 9 Series可以识别并且处理这种情况,但是Windows Media Format SDK的写入对象不会自动处理,所以应用程序必须并且处理这种情况.
下面是一个XML格式的配置
<profile version="589824" storageformat="1" name="ICW" description="ICW Stream">
 // 73647561-0000-0010-8000-00AA00389B71  'auds' == WMMEDIATYPE_Audio 
 <streamconfig majortype="{73647561-0000-0010-8000-00AA00389B71}" streamnumber="1" streamname="Audio Stream" inputname="Audio804" bitrate="1411200" bufferwindow="-1" reliabletransport="0" decodercomplexity="" rfc1766langid="zh-cn">
  // 00000001-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_PCM 
  <wmmediatype subtype="{00000001-0000-0010-8000-00AA00389B71}" bfixedsizesamples="1" btemporalcompression="0" lsamplesize="4">
     <waveformatex wFormatTag="1" nChannels="2" nSamplesPerSec="44100" nAvgBytesPerSec="176400" nBlockAlign="4" wBitsPerSample="16" /> 
    </wmmediatype>
   </streamconfig>
   // 73647561-0000-0010-8000-00AA00389B71  'auds' == WMMEDIATYPE_Audio 
 <streamconfig majortype="{73646976-0000-0010-8000-00AA00389B71}" streamnumber="2" streamname="Video Stream" inputname="Video804" bitrate="4000" bufferwindow="1000" reliabletransport="0" decodercomplexity="AU" rfc1766langid="zh-cn">
    <videomediaprops maxkeyframespacing="80000000" quality="35" /> 
    // 56555949-0000-0010-8000-00AA00389B71  'YV12' ==  MEDIASUBTYPE_IYUV 
  <wmmediatype subtype="{56555949-0000-0010-8000-00AA00389B71}" bfixedsizesamples="1" btemporalcompression="0" lsamplesize="0">
   <videoinfoheader dwbitrate="4000" dwbiterrorrate="0" avgtimeperframe="1000000">
      <rcsource left="0" top="0" right="0" bottom="0" /> 
      <rctarget left="0" top="0" right="0" bottom="0" /> 
      <bitmapinfoheader biwidth="0" biheight="0" biplanes="1" bibitcount="12" bicompression="IYUV" bisizeimage="0" bixpelspermeter="0" biypelspermeter="0" biclrused="0" biclrimportant="0" /> 
     </videoinfoheader>
    </wmmediatype>
   </streamconfig>
   // 73636d64-0000-0010-8000-00AA00389B71  'scmd' == WMMEDIATYPE_Script 
 <streamconfig majortype="{73636D64-0000-0010-8000-00AA00389B71}" streamnumber="3" streamname="Script Stream" inputname="Script804" bitrate="2560" bufferwindow="-1" reliabletransport="0" decodercomplexity="" rfc1766langid="zh-cn">
  <wmmediatype subtype="{00000000-0000-0000-0000-000000000000}" bfixedsizesamples="0" btemporalcompression="0" lsamplesize="0">
  // 82f38a70-c29f-11d1-97ad-00a0c95ea850        WMSCRIPTTYPE_TwoStrings 
    <WMSCRIPTFORMAT scripttype="{82F38A70-C29F-11D1-97AD-00A0C95EA850}" /> 
    </wmmediatype>
   </streamconfig>
</profile>
媒体采样(Media Sample)
媒体采样,或者采样,是一块数字媒体数据。采样是Windows Media Format SDK可以读写的数据的最小单位。采样内容由采样相关的媒体类型指出。对于视频,每个采样表示一个桢,每个单独采样中包含的数据量由创建ASF时指定的设置设置。
采样可以包含未压缩的数据,或者压缩过的数据,这时被称为流采样。创建ASF时,采样被传递给写入对象,写入对象使用相关的编码器压缩数据,并且写入ASF文件的数据段。播放时,读出对象读出压缩的数据,解压数据,并且提供未压缩格式的数据。
采样被封装在Windows Media Format SDK的自动分配的缓冲区对象中。需要的时候,你也可以自己分配缓冲区对象,使用它的读写特性。
这里的采样并非音频采样。通常,音频采样质量用每秒录制的采样数据数量表示,例如CD质量是44,100采样/秒,或者44.1 kHz。
输入,流和输出
输入对象是你用于写入文件的任何数字媒体流,必须是可以支持的格式。支持很多标准RGB和YUV作为视频输入格式,PCM作为音频输入格式。如果编码器不支持某种输入格式,那么写入对象会初始化一个辅助对象,转换输入流到可以支持的格式,例如调整色深转换、缩放,调整声音质量、采样率和频道数目。某些情况下,压缩格式的食品和音频可用于输入。输入也可以是其他格式,例如文字,脚本命令,图像,或者任意文件数据。
输出是读取对象传递给应用程序,提供用户体验的数据。一个输出等同于一个流。如果你使用互斥属性,那么所有互斥数据共享一个输出。
一个流是一个ASF文件中包含的数据。一个流的生命期中只有一种压缩设置。一个简单的ASF具有两种流:视频和音频。更加复杂的ASF文件可以包含两路音频和多路视频。音频可以有同样的压缩设置,但是内容不同,例如不同语言的讲解;视频可以有同样的内容,但是具有不同的压缩比例。格式是在设置对象中指定的。
某些输入可以是压缩过的,这时读取对象必须以流编号依次访问数据,而不是按输出顺序访问数据。
编号
流具有从1开始的编号,这是在设置中指定的。同时,流具有一个索引以在设置中枚举流。这两个数字并不相关,例如输入1并不一定是编号为1的流,编号为1的流并不一定是输入1,等等。
格式
每种媒体类型的全部信息。每个格式有一个主类型,例如音频或视频,并且可能有一个子类型。格式包含依赖于主类型的不同信息。视频和音频格式比其他格式需要更多信息。
输入格式
描述你传递给写入对象的数字媒体类型。如果ASF文件中的流是用编码器压缩,那么编码器只支持某些输入格式。使用Windows Media 音频和视频编码器时,可以使用写入对象枚举支持的输入格式。写到文件时,你有责任选择一个匹配输入媒体的输入格式。
某些格式不必匹配编码器指明的输入格式,编码器可以自行转换数据到需要的格式。
流格式
ASF文件中的数据保存形式。在设置中描述,可以符合或不符合输入、输出格式(例如使用了某种编码/解码器)。可能必须获得编码/解码器信息之后,才可以设置流格式
输出格式。
描述你传递给读出对象的数字媒体类型。如果ASF文件中的流是用编码器压缩,那么编码器只支持某些输出格式。使用Windows Media 音频和视频编码器时,可以使用读出对象枚举支持的输出格式。读出文件时,你有责任选择一个匹配输出媒体的输出格式。
某些格式不必匹配编码器指明的输出格式,编码器可以自行转换数据到需要的格式。
比特率(Bit Rate)
每秒传递给ASF的数据的数量,以位/秒(bps)或者千位/秒(kbps)为单位。经常与带宽混淆,带宽也以bps或者kbps为单位。
如果用户的带宽小于ASF的比特率,那么播放可能中断。通常,带宽不足会导致跳过某些采样,或者更多的数据缓冲时间。
每个ASF文件创建时被指定一个比特率,它基于文件中流的数量。不同的流可以有不同的比特率。比特率可以是常数(压缩的数据可以以基本同样的速度被传输)或者可变(保留压缩的数据质量,即使可能造成突发数据溢出)。
同一个内容可以被压缩成多个比特率不同的流,然后你可以配置他们为互斥的。这个属性叫多比特率(multiple bit rate), 或者MBR.
元数据
描述ASF文件或者文件内容的信息,位于文件头。元数据的项称为属性。每一个属性由名字和值组成。全局常数用于标识属性,例如ASF文件的标题被保存在 g_wszWMTitle 属性中。在Windows Media Format SDK 中定义了最常用的内建属性,但是你也可以定义自己的属性。由于其他开发者可能和你是用同样的名字,所以可能造成冲突。
一些全局属性可以被修改,例如g_wszWMSeekable属性(文档是否可以从任意点被读取)
一些属性纯粹用于信息用途,并且必须被设置,例如g_wszWMAuthor属性(作者)
属性可以被应用到整个文件或者单独的流。
你可以用Windows Media Format SDK编辑MP3文件的元数据,但是必须使用ID3-compliant属性保留与其他MP3应用程序的兼容性。
媒体时间
自第一个采样开始的时间计量方式,单位和SDK其他时间的单位一样,是100纳秒。它使得文件中不同的流可以被同步。你写入的每一个采样都必须有媒体时间。ASF文件数据段中每一个数据对象都有媒体时间。每一个输出的数据也都有媒体时间。
缓冲
读取对象打开流文件时从文件头的信息决定缓冲区大小。实际比特率是变化的,但是平均值应该是设置中指定的值。
缓冲窗口是以可以缓冲的数据时间长度来衡量的。例如,32Kbps的流,3秒的缓冲窗口,意味着缓冲区大小为 12,000字节(32000*3/8)。解码器限制了这个数值,所以缓冲窗口的平均比特率不大于流的比特率。
通常在设置中指定这个值,写入对象处理剩下的部分。写入压缩数据到流时,必须自己确定写入的速度不会超出这个值
ASF文件中的段
一个ASF文件中的段以对象的方式组织起来。一共有三种顶层对象,必须有的头对象(Head),数据对象(Data),以及可选的索引对象(Index)。
每个对象都以全球唯一标志(GUID)和大小开始。这些数字使得文件读者可以解析这些信息,并且载入到相应的对象。因为这些GUID,底层的对象可以以任何顺序排列,并且仍然可以被识别。这使得一个不完整的ASF文件仍然可被正确读取,只要有一个完整的文件头和至少一个数据对象。某些对象,例如流属性对象,可能有多个示例。
头对象包含文件的描述信息,同时是唯一的顶层对象容器。
数据对象以包的格式存储流数据。数据对象还具有文件ID和包总个数属性,但是对于流格式,包总个数属性没有意义。
每一个数据包包含发送时间和持续时间。这使得读者可以发现流传输的中断。
数据包的数据被封装到载荷(payloads)中。一个载荷可以包含一个或者多个媒体对象(media objects),媒体对象的一个例子是视频流的一个桢。大的媒体对象,例如视频流的一个关键桢,可能被扩展到多个载荷,甚至多个包。为了跟踪对象的片断,每个对象的段具有从0到255的编号。
除了数据之外,载荷也具有以毫秒为单位的时间戳。
所有的包具有头对象中指定的统一的大小。当一个包包含的数据少于指定大小时,用数据("padding" data )填充不足部分。
索引对象包含时间《-》关键桢的配对,以更有效地在文件中定位。因为它处于文件末尾,实时媒体不能访问这个对象。
使用回调方法
一些Windows Media Format SDK的接口的方法是异步执行的,很多这样的方法使用回调方法和应用程序通讯。
使用OnStatus回调
在Windows Media Format SDK中,IWMStatusCallback::OnStatus 被很多对象调用。OnStatus接收SDK操作状态的变化。每种对象可能有不同的方式连接到IWMStatusCallback。
使用事件进行同步调用
1 使用Platform SDK的API CreateEvent创建一个事件对象
2 实现回调函数,,捕获事件,并且调用SetEvent函数标记事件对象
3 在应用程序中调用WaitForSingleObject 、监视事件对象。如果你是在为Windows程序编写代码,你必须创建一个消息循环对用户操作做出相应。
使用上下文参数
Windows Media Format SDK的一些回调函数具有pvContext参数,这个值是你在异步操作启动时传递给对象的。
通常,多个对象使用同一个回调时传递对象指针作为这个参数。
使用设置
设置的主要目的是描述其中的对象,以及对象之间的关系。不管是否使用编码/解码器,某些流需要配置才可以工作。流的配置信息可以用IWMCodecInfo3 接口的方法获得,但是不要手动配置一个使用了Windows Media编码/解码器的流。
创建/编辑设置的步骤
1 创建空设置,或者打开旧设置
2 配置每个流,如果需要的话,使用从编码/解码器获得的数据
3 配置互斥(可选)
4 配置带宽共享(可选)
5 配置优先级(可选)
设计设置
选择编码方式
1-pass Constant Bit Rate (CBR) 直播的唯一选择。以预定的码流率编码,并且质量最低。
2-pass CBR 文件形式的流媒体,长度固定,质量比1-pass Constant Bit Rate (CBR)好
1-pass Variable Bit Rate (VBR) 需要指定质量时使用,本地播放或者下载后播放
2-pass VBR – unconstrained 需要指定带宽时使用,但是真实带宽占用可以偏离指定带宽,本地播放或者下载后播放
2-pass VBR – constrained 需要指定带宽时使用,但是真实带宽占用不能大于指定带宽,本地播放或者下载后播放
码流率
除了数据之外,分包也要占用一定的带宽。如果流包含数据单位扩展,那么这将大大增加流的码流率。
同时,除了应用程序之外的任何连接都和应用程序共享网络带宽,所以不能认为应用程序可以完全使用客户的网络带宽。
配置流
如果流是视频/音频,使用Windows Media编码/解码器,那么你必须使用IWMCodecInfo3的方法从编码/解码器获得流配置对象。
如果流是其他类型,使用IWMProfile::CreateNewStream.创建一个新的流配置对象。
每个流配置都必须设置名字、连接名和流序号(从1到63)。
可能会修改使用Windows Media编码/解码器的two-pass VBR 音频流的VBR设置。视频流无需修改配置。
根据类型配置其他类型流。所有的这种流需要设置比特率和缓冲窗口。
使用IWMProfile::AddStream. 将流添加到媒体。
大部分设置可以通过IWMMediaProps访问。这些设置保存在WM_MEDIA_TYPE 结构中。对于音频和视频,WM_MEDIA_TYPE结构指针指向媒体特定的更多信息,通常是WAVEFORMATEX 或者WMVIDEOINFOHEADER结构。视频有第三个结构BITMAPINFOHEADER描述了视频的桢。
从编码/解码器获得流配置信息
使用Windows Media编码/解码器的视频/音频流需要从编码/解码器获得流配置信息。尽管你可以自行设置这些配置,从编码/解码器获得流配置信息使得数据是准确的。除非文档推荐,否则不要修改获得的流配置信息。
可以从设置管理器的IWMCodecInfo, IWMCodecInfo2, 和IWMCodecInfo3接口获得信息。
枚举安装的编码/解码器
编码/解码器的编号从0开始,音频和视频的编码/解码器有独立的编号。
枚举编码/解码器支持的格式
配置音频流
不要手动修改获得的配置的质量设置,而应该用IWMPropertyVault接口修改。
音频流的缓冲窗口不应该设置得比视频流的缓冲窗口大,否则会造成播放不同步。通常,音频流的缓冲窗口是1.5-3秒,视频流的缓冲窗口是3-5秒。
配置视频流
除非是RGB24数据,否则大小应该是4的倍数,否则会有非法格式/非法配置等错误。
配置屏幕流
和视频流一样,但是如果复杂度设置为0,那么IWMVideoMediaProps::SetQuality设置的质量会被忽略。
图像流
包含JPEG形式的图像数据。
视频流的定位性能
可以使用IWMVideoMediaProps::SetMaxKeyFrameSpacing设置关键桢间隔。增加关键桢数目会降低视频质量。
未压缩的音视频格式
不能用于流,必须手动设置带宽,缓冲窗口应该设为0
配置其他流
通常,这种流只需要比特率和缓冲窗口和WM_MEDIA_TYPE 中的媒体主类型设置。但是某些类型的流还需要其他设置
脚本流
WM_MEDIA_TYPE的成员formattype 要设置为WMFORMAT_Script,指明pbFormat成员指向一个WMSCRIPTFORMAT 结构。
只有一种脚本媒体类型,WMSCRIPTTYPE_TwoStrings。
文件传输流
每个采样需要一个数据单位扩展,你需要实现一个数据单位扩展系统。
调用IWMStreamConfig2::AddDataUnitExtension添加数据单位扩展到流。
hr = pStreamConfig2->AddDataUnitExtension(CLSID_WMTPropertyFileName,
                                          -1, NULL, 0);
网页流
WM_MEDIA_TYPE.majortype WMMEDIATYPE_Filetransfer. 
WM_MEDIA_TYPE.subtype WMMEDIASUBTYPE_WebStream. 
WM_MEDIA_TYPE.bFixedSizeSamples False. 
WM_MEDIA_TYPE.bTemporalCompression True. 
WM_MEDIA_TYPE.lSampleSize 0. 
WM_MEDIA_TYPE.formattype WMFORMAT_WebStream. 
WM_MEDIA_TYPE.pUnk NULL. 
WM_MEDIA_TYPE.cbFormat sizeof(WMT_WEBSTREAM_FORMAT). 
WM_MEDIA_TYPE.pbFormat 一个配置好的WMT_WEBSTREAM_FORMAT结构的指针. 
WMT_WEBSTREAM_FORMAT.cbSampleHeaderFixedData sizeof(WMT_WEBSTREAM_SAMPLE_HEADER). 
WMT_WEBSTREAM_FORMAT.wVersion 1. 
WMT_WEBSTREAM_FORMAT.wreserved 0. 
文本流
媒体类型WMMEDIATYPE_TEXT
计算比特率和缓冲窗口
简单的办法是设置为数据长度/时间.但是图像和文件流可能突发数据很多,但是有很多空闲时间.缓冲窗口必须设置得足够大.需要的时候,可以适当增加这些值.
变码流率流
数据单位扩展
保存/重新使用配置
不要手动更改PRX文件。看起来很小的改变会使得配置无效。
互斥
流优先级
带宽共享
包大小
写ASF文件
使用IWMWriter::SetProfile对写入对象进行设置。但是,设置了之后,对设置对象的修改不会自动反映到写入对象,除非再次调用IWMWriter::SetProfile。
设置写入对象会复位全部头属性,所以必须在设置之后再修改这些属性。
输入
设置对象中的每个连接有一个输入号。除非配置中有互斥流,否则每个流有一个连接。互斥流共享连接。
写入流时需要用输入号来区别每个流,所以必须用连接名字来判断每个流的输入号。
枚举输入格式
SDK可以对输入进行预处理来判断输入的格式是否支持。
设置输入格式
找到符合数据的输入格式之后,可以调用IWMWriter::SetInputProps让它可以被写入对象使用。对于视频流,必须设置桢的大小。
其他类型的流和预压缩流
其他类型的流无需设置。
预压缩流需要设置输入格式为NULL。这个设置必须在BeginWriting之前完成。同时需要调用IWMHeaderInfo3::AddCodecInfo设置预压缩流的格式。
BeginWriting之前,还可以用IWMWriterAdvanced2::SetInputSetting设置和流无关的设置。
元数据
使用写入对象的IWMHeaderInfo 或者IWMHeaderInfo2接口访问元数据。必须在IWMWriter::BeginWriting之前完成元数据的写入。
注意,如果创建了写入对象而没有释放,然后再创建写入对象,一些元数据会被复制到新的对象中。
写入采样
写入采样之前要调用IWMWriter::BeginWriting.
1 用IWMWriter::AllocateSample分配缓冲区,并且获得其INSSBuffer接口
2 用INSSBuffer::GetBuffer获得缓冲区地址
3 复制数据到缓冲区中
4 用INSSBuffer::SetLength设置复制的数据长度
5 把缓冲区、输入编号和媒体时间传递给IWMWriter::WriteSample方法。音频数据持续时间是一样的,所以可以简单地在现有时间上加上一个常数。对于视频,需要根据桢率计算媒体时间。
WriteSample是异步调用,在下一次WriteSample调用之前可能没有结束。所以要在每次写入采样之前调用AllocateSample获取缓冲区对象。
所有采样写完之后,调用IWMWriter::EndWriting完成写入操作。
流数据应该几乎同时结束,否则某些流数据可能丢失。
写入压缩采样
使用IWMWriterAdvanced::WriteStreamSample 替代IWMWriter::WriteSample。
写入图像采样
必须用IWMWriterAdvanced2::SetInputSetting设置图像质量g_wszJPEGCompressionQuality,范围从1到100。图像采样压缩比通常很大,所以要使用尝试的方法设置缓冲窗口大小。
强制关键桢
使用INSSBuffer3::SetProperty设置缓冲区对象的WM_SampleExtensionGUID_OutputCleanPoint为TRUE。 
读取
输出
默认方式下,每个采样有一个输出编号,对应于ASF文件中的一个流。读取者打开ASF文件时,为每个流赋予一个编号。通常对每个流都有一个输出。但是对于互斥的流,每一组互斥流只有一个输出。多码流率文件的情况,或者程序自行选择流的情况下,输出对应的流是由读取者决定的。
因为流的连接名字并未保留在文件中,读取者为每个流创建一个简单的连接名字,就是输出号的字符形式,例如"1","2","3"等等。
每个输出有由编码器决定的一个或者多个支持的输出格式,打开时默认是从媒体的子类型获得默认输出格式。
使用异步方式读取ASF文件
1 实现IWMReaderCallback,处理读取者的消息,OnStatus处理状态消息,OnSample处理解压过的数据
2 让读取者打开一个文件,为每个流设置一个输出号
3 从读取者获得输出格式信息
4 让读取者开始播放,采样在指定的媒体时间传递给OnSample,直到读取者被停止或者达到文件末尾
5 数据到达时,程序负责播放采样
6 播放结束之后,让读取者关闭。
如果采样是预压缩的,那么需要实现的是IWMReaderCallbackAdvanced::OnStreamSample 。IWMReaderCallbackAdvanced::OnStreamSample几乎和OnSample完全一样,除了它基于流编号而不是输出编号之外。在开始回放之前,获得读取者对象的IWMReaderAdvanced接口,为每个预压缩流流调用IWMReaderAdvanced::SetReceiveStreamSamples.
定位
一个ASF文件必须被适当的配置才可以定位到指定时间。默认情况下只有音频的文件可以定位,但是包含视频的文件需要有索引才可以。如果你不确定文件的创建方式,你可以调用用IWMHeaderInfo::GetAttributeByName,传递g_wszWMSeekable来获得是否可定位信息。
调用IWMReader::Start可以定位到指定时间。
[开发经验]
选择编码器
Windows Media
尽管在低码流率下的效果令人满意,但是编码时系统资源占用过高,同时在高码流率的情况下效果不甚理想。
Windows Media Video 9
Windows Media Video 9 Screen
对于格式比较挑剔,例如视频的规格必须是按双字对齐的。对于长时间的多媒体编码,有阶段性的质量变化(一段时间内桢率高,过一段时间桢率低)
Windows Media Audio 9
Windows Media Audio 9 Professional
系统资源占用过高致使采样不足的话会造成音调的变化,效果不可忍受。
自定义编码器
多种数据混合编码,避免了同步问题,但是不能单独为一种数据指定码流率和优先级等信息。
旅行者 http://www.cnblogs.com/shenghuafen/articles/23396.aspx Mon, 12 Jul 2004 05:39:00 GMThttp://www.cnblogs.com/shenghuafen/articles/23396.aspxhttp://www.cnblogs.com/shenghuafen/articles/23396.aspx#Feedback0http://www.cnblogs.com/shenghuafen/comments/commentRss/23396.aspx http://www.cnblogs.com/shenghuafen/services/trackbacks/23396.aspx   
由于网络带宽的限制以及编码技术的制约,实时视频通信应用中存在视频质量差、图像延时大和抗分组丢失能力弱等问题,而在包括音频、视频和数据的视频会议呼叫中,视频部分通常会占用整个呼叫可用带宽的绝大部分。本文介绍的H.26L针对这种问题,能将带宽需求降低50%,因而可在低带宽网络上实现视频会议系统应用。 
从固定和移动视频电话以及视频会议到DVD和数字电视,数字视频正被越来越多的应用采用。这一现象之所以出现归功于视频编码标准的发展,有了这些编码标准,系统和系统之间才能实现互通性。此外,这些标准也为降低整个网络结构中所需的带宽作出了贡献,并在位率不变时,让系统可以获得更好的视频质量,同时减小系统对视频存储的要求。几年以前,基于模块的压缩算法才趋于成熟,而如今出现的H.26L标准却已经在编码效率上实现了突破,它可以通过进一步扩展优先标准中的基本技术,将位率降低50%。 
H.26L中包含帧内预测(intra prediction)功能、更灵活的运动补偿功能、新的4×4整型转换功能,还能实现功能更强大的熵编码,这些对于H.26L而言都很关键。H.26L中提供了多种编码工具,这就使系统开发商能够针对不同的终端系统应用来优化其算法,达到区分产品的目的。但在开始采用H.26L进行开发之前,我们必需了解它能够作些什么,以及如何完成其功能。只有这样,设计者才能很好的利用这项刚刚出台的视频编码标准所具备的优势进行设计。 
H.26L概述 
开发视频编码标准的正式组织有两个,其一是ITU-T,其二是ISO/IEC JTC1。ITU-T视频编码标准被称作建议,以H.26X的形式表示(例如,H.261、H.262、H.263和H.26L)。ISO/IEC标准则以MPEG-x的形式表示(例如,MPEG-1、MPEG-2和MPEG-4)。 
ITU-T建议本来是为视频会议和视频电话等实时视频通信应用设计的,而MPEG标准主要则是为视频存储(DVD)、广播视频(广播TV)以及视频流(例如,网上视频、DSL上的视频以及无线视频应用)设计的。这两个标准委员会通常都独立工作,唯一的例外就是二者合作开发了H.262/MPEG-2标准。 
最近,ITU-T和ISO/IEC已经达成协议,再次合作开发由ITU-T发起的H.26L标准。他们之所以能在开发H.26L上达成一致,原因在于,从性能的角度而言,H.26L超越了现有的所有视频编码标准。图1对ITU-T建议和ISO/IEC MPEG标准的发展演化过程进行了总结。 
开发H.26L项目的目的,是为了通过采用“Back-To-Basics”方法,开发出一种基于通用模块的,简单直接的高性能视频编码标准。H.26L标准的开发工作是由ITU-T视频编码专家组(VCEG)发起的,开始于1997年。到2001年年底,他们发现,基于H.26L的软件所能提供的视频质量,就是现有的最好的基于MPEG-4的软件也无法与之媲美。于是,ISO/IEC MPEG与ITU-T VCEG结合起来组成了一个联合视频开发组(JVT),接管了H.26L项目。JVT希望建立一个唯一的视频编码标准,同时使其成为MPEG-4标准家族和ITU-T建议家族的新成员(比如,成为MPEG-4中的第10部分或ITU-T中的H.264)。 
H.26L的开发目前正在进行中,其第一版有望在2003年年底前公布。 
当前的H.26L标准中包含了一些能够使其区别于现有的一些其它标准的特性,如: 
1. 对位率的节约高达50%。在大多数位率的情况下,当编码优化程度接近时,H.26L与H.263v2(H.263+)或MPEG-4简化版相比,H.26L可以允许位率的降低程度平均达到50%。2. 可提供高质量的视频信号。H.26L即使在位率很低的情况下也能提供质量稳定的视频信号。3. 对延时约束的适应性较强。当用于实时通信应用中(例如视频会议)时,H.26L可以以低延时模式工作,而应用于对延时没有要求的应用中(例如视频存储)时,H.26L又可以以较高的效率处理延时。4. 具有误差处理能力。在分组网络中出现分组丢失时或在较易出错的无线网络中出现误码时,H.26L能够提供处理这类问题所必需的工具。5. 网络非常友好。在H.26L中,有一个新的特性,那就是视频编码层和网络适配层从概念上分离开来。视频编码层用于对视频图像的内容进行高比压缩,而网络适配层用于根据用户所使用的网络类型的不同,将压缩后的信息打包。这使得分组过程变得更加灵活和简单,同时也改善了对信息优先权的控制情况。 
综合以上这些特性,可以看出H.26L在视频应用方面具有相当的优势。在本文的结束部分,我们将讨论H.26L用于视频会议时所具备的优势。 
H.26L是如何实现上述功能的呢? 
开发H.26L的主要目的是希望找到一种方法来充分地实现更好的视频质量,这种视频质量是任何现有视频编码标准都无法达到的。但H.26L的实现方法和以前的那些标准(例如H.263和MPEG-4)中所用到的方法差别并不显著,它包含以下四个主要步骤: 
1. 首先,将每个视频帧分成像素块,于是,对视频帧的处理可以建立在处理像素块的基础上。2. 其次,通过进行变换、量化和熵编码(或可变长度编码),对一些原始像素块编码,从而将视频帧中的空间冗余度利用起来。3. 然后,只对连续帧之间出现的变化进行编码,从而充分利用连续帧之间存在的时间冗余度。这个过程是通过运动估值和补偿来实现的。4. 最后,对余差模块编码,也就是说,通过变换、量化和熵编码对原始模块和相应的预测模块之间的差异进行编码,从而充分利用视频帧内剩余的空间冗余度。 
从编码的角度来看,H.26L和其它编码标准的主要差别如图2中的编码模块框图所示。从运动估值和补偿的角度来看,H.26L采用了各种尺寸和形状的模块,子像素运动估值的分辨率更高,并且可以有多种参考帧选择方案。从所采用的变换方式来看,H.26L采用的基于整数的变换方式类似于早期那些标准中所采用的DCT变换,不同的是,采用这种变换方式进行反变换时,不存在失配问题。 
在H.26L中,熵编码有两种实现方法,其一是利用一个通用的可变长度编码表来实现,此外,也可由基于上下文的自适应二进制算术编码实现。 
如何组织位流 
前面讲到,在H.26L中,我们会将一个给定的视频图像化分为许多小像素块,这些小像素块就叫做宏块(macroblock)。如图3所示,我们将一幅分辨率为QCIF(176×144像素)的图像划分为99个16×16的宏块。对其它帧所作的宏块分段处理与此类似。 
我们以原图像的分辨率对该图像的亮度信息取样,而对图像的色差信息Cb和Cr,则从水平方向和垂直方向上进行下取样。此外还应注意的是,一幅图像只能被分割成整数片,因为如果该图像在传输过程中丢失了一些信息的话,那么整数片的分割方法会大大有助于信息的再同步。 
帧内预测(intraprediction)编码 
帧内预测(intraprediction)编码 
帧内编码是指只利用视频图像内的空间冗余度来优化编码。采用这种编码方式得到的图像帧被称作I-图。I-图通常是通过直接对一帧中的各宏块进行变换得到的,其文件很大,因为此时帧内还含有大量的信息,而且编码过程丝毫没有利用图像的时间信息。 
要提高H.26L中帧内编码过程的编码效率,就必须将同一帧中相邻宏块之间的空间关联性利用起来。提出这一想法的依据是人们发现相邻的宏块常常具有类似的特性。因此,作为对某一给定宏块进行编码的第一步,我们可以根据周围的宏块来预测我们所感兴趣的宏块,通常我们会选择目标宏块左侧和上侧的宏块,因为这些宏块已经经过编码了。然后再对实际的宏块与预测宏块之间的差别进行编码。这样,要表达出我们所感兴趣的宏块时所需的位数就比直接对该宏块进行变换所需的位数少得多。 
H.26L提供了6种模式用于实现4×4亮度块的预测,包括直流预测(模式0)和其它5种有方向的预测模式(模式1到模式5,如图4所示)。图中,像素A到像素I均经过编码,可将这些像素作为相邻模块,用于预测目标块。 
例如,如果选择模式2进行预测,那么像素a、e、i和m在预测中被设置为与像素A相等,像素b、f、j和n在预测中被设置为与像素B相等。对于空间细节含量较少的区域(平坦区域),H.26L也支持16×16的帧内编码,此时可在4种预测模式中选用一种来对整个宏块进行预测。 
最后,每个块在选择其预测模式时,它采用各种模式的可能性由其周围模块编码时所采用的预测模式来决定,分配给某模式的符号越短,采用这种模式的可能性就越大。 
帧间预测和编码 
在帧间预测和编码(interprediction and coding)中,运动估值和补偿在实现时必须利用连续帧之间存在的时间冗余度,因而这种方法可有效地实现视频序列的编码。如果运动估值所选定的参考帧是一个经过编码的帧,那么目标帧(被编码帧)就叫做P-图。如果已编码帧和未编码帧均被选作参考帧,那么目标帧就叫做B-图。 
H.26L中的运动估值能够支持早期视频标准中的大多数重要特性,不同的是H.26L中的功能更多也更灵活,因而其效率得到了改善。除了支持P-图(既支持单参考帧也支持多参考帧)和B-图以外,H.26L还支持一种新的叫做SP-图的流间过渡图像。H.26L中采用的运动估值所具备的主要特性包括:块大小和形状多种多样,高精度的子像素运动向量,多参考帧以及预测环路中的消块滤波器。 
1. 块大小:我们可以通过使用多个不同大小和不同形状的块来完成每个16×16宏块的运动补偿,见图5。即使只有4×4那么小的块,H.26L也可为其传送特有的运动向量,因此H.26L最多可以为每一个宏块传送16个运动向量。H.26L同时也支持大小为16×8、8×16、 8×8、8×4和4×8的块,如图5所示。H.26L这种能够对小尺寸块进行运动补偿的能力,从整体上改善了目标预测的性能。特别值得一提的是,这同时还改善了整个系统模型处理精细运动细节的能力,并使得主观视觉质量得到提高,因为这些小尺寸块不会生成大的块状马赛克。 
2. 运动估值的精确性:如果不由现有标准能达到的空间精确度来决定运动向量,而由更高级的空间精确度来决定运动向量,那么H.26L中算法的预测能力又会得到进一步增强。H. 26L中,四分之一像素精确度(Quarter-pixel-accurate)是其最低运动补偿精度。而在高位率和高视频分辨率下,采用八分之一像素精确度(eighth-pixel accuracy)可能对提高编码效率很有帮助。 
3. 可选择多个参考图像:H.26L标准提供了一个选项,在图像进行帧间互编码时可以选择多个参考帧,最多5个,这样,主观视频质量更好,对需要编码的视频帧进行编码的效率也更高。此外,采用多个参考帧也可以使H.26L位流具备更强的差错处理能力。 
具备消块滤波器:H.26L定义了一种自适应消块滤波器,该滤波器位于预测环路内,可工作于水平块边缘和垂直块边缘,以去除由于块预测误差引起的干扰效应。这种滤波通常是基于大小为4×4的块边界进行的,边界的两端上均有两个像素通过三点式滤波得到更新。 
H.26L中的整数转换 
H.26L中的整数转换 
不论是帧内预测还是帧间预测,预测误差块中包含的信息最后都以变换系数的形式表达出来。H.26L采用了一种和浮点8×8 DCT相反的纯整数空间转换(类似于离散余弦变换,形状为4×4),这种转换方法由早期的标准中用过的舍入误差容限定义。4×4的小尺寸有助于降低块状和环状马赛克,而采用整数转换又消除了反变换过程中编码器和译码器之间的失配问题。 
H.26L中的量化 
H.26L中的量化 
量化是数据压缩中很重要的一步。在H.26L中,变换系数通过无扩展死区的分级量化量进行量化。在每个宏块的基础上可选择32种不同的量化步长,这与早前一些标准的量化能力(例如,H.263支持31种不同量化步长)类似。但在H.26L中,量化步长是以前次步长的12.5%的速率递增,而不象过去的标准中那样每次递增一个常量。有些时候,亮度系数的量化非常粗糙,而色差信号在量化时则采用了这种更精细的量化步长,因而色差信号的保真度较亮度系数大有改善。 
量化后的变换系数对应于各种不同的频率。图6左上角的系数代表直流值,而其它部分的系数则代表各种非零的频率值。编码过程的下一步就是将量化后的系数排成一列,直流系数排在列首。 
H.26L规定了两种不同的系数扫描方式,见图6。大多数情况下采用的都是简单的双扫描方式,这种方式和早期的视频编码标准中所采用的传统扫描方式相同,根据系数所对应的频率将他们以升序方式排列。要提高编码效率就得采用双扫描方式,这种扫描方式只适用于量化步长较小的块内扫描。 
熵编码 
熵编码是视频编码过程中的最后一步。至今为止,H.26L中只采用了两种熵编码方法。第一种方法的基础是对通用可变长度码(UVLC)的应用,第二种方法的基础是基于上下文的自适应二进制算术编码。人们已经为在熵编码中统一采用一种方法付出了实质性的努力,这种方法很可能是基于特殊VLC的自适应应用的一种方法。 
在对量化后的变换系数、运动向量以及其它编码信息进行压缩的各种方法中,基于VLC的熵编码方法是使用最广泛的一种。VLC的基础就是为出现可能性较大的符号分配较短的码字,而为出现频率较低的符号分配较长的码字。各符号和相应的码字存储在一个叫做VLC表的查找表中,编码器和译码器中都存有该表。 
在H.263之类视频编码标准中,根据感兴趣信息的类型(例如变换系数或运动向量)不同,需使用许多的VLC表。而在H.26L中,不论符号所代表的是什么数据类型,都可以用一个通用的VLC表来对编码器中所有的符号进行熵编码。 
基于上下文的自适应二进制算数编码在编码器和译码器内都采用了一种概率模型,该模型适用于所有的语法元素(如变换系数、运动向量)。为了提高算术编码方式的编码效率,我们可以通过对上下文建模,将一个潜在的概率模型应用于视频帧的不断变化的统计量。这样,我们就能对编码符号进行有条件的概率估计。 
如果我们采用了恰当的上下文模型,那么我们就可以根据当前符号周围的已编码符号的情况来决定如何在各种概率模型之间切换,从而达到利用符号间已有的冗余度的目的。每个语法元素都支持一个不同的模型,例如,运动向量和变换系数的模型就不相同。如果一个给定的符号具有非二进制的值,那么就将它映射为一个二进制序列,或者叫做“bins”。确切的二进制值转换是通过一个给定的二进制树实现的,在本文讨论的模型中采用的是UVLC二进制树。 
接着,采用新的概率估计来对这个二进制结果进行算术运算,此处采用的概率估计系在前一次上下文建模阶段更新后的概率估计。在对每个二进制数值编码过后,这个概率估计的值又要根据刚刚编码之的二进制符号进行调整。 
本文小结 
在利用数字信号处理器实现H.26L的过程中,充分利用了各种新技术,使得实时视频通信应用的视频质量和图象延时都有所改善。一个实时视频会议应用最能说明H.26L的实现机理。视频会议一般都将稳定的视频质量、较低的延时和较强的抗分组丢失能力作为最主要的要求(即便在带宽有限的情况下也要求视频质量稳定)。而在一次涉及音频、视频和数据的视频会议呼叫中,视频部分通常会占用整个呼叫可用带宽的绝大部分。如果视频部分所需的带宽能够得到降低,那么将会有更多的低带宽网络接受视频会议系统这种应用。H.26L就针对这种需求,将带宽需求从H.26+所需的320kbps降低到160kbps。 
此外,许多视频会议解决方案为了保证视频质量令人满意,仍在采用二次(two-pass)编码方式,但这种编码方法会为会议呼叫引入令人讨厌的延时。H.26L方案则保证了即使只采用一次性(one pass)编码仍能得到优秀的视频信号,这样做也就降低了二次编码方法中的处理延时。尽管在目前,大多数视频会议呼叫都发生在本地专用网上,但在分组传输中仍然会出现一定程度的分组丢失。H.26L具备的编码端的误差处理能力和在解码端的隐藏错误的能力使其即使在分组丢失率很高的情况下也能有效对抗这种分组丢失
旅行者 http://www.cnblogs.com/shenghuafen/articles/23394.aspx Mon, 12 Jul 2004 05:29:00 GMThttp://www.cnblogs.com/shenghuafen/articles/23394.aspxhttp://www.cnblogs.com/shenghuafen/articles/23394.aspx#Feedback0http://www.cnblogs.com/shenghuafen/comments/commentRss/23394.aspx http://www.cnblogs.com/shenghuafen/services/trackbacks/23394.aspx   
随着计算机的发展,周边的数字视频设备也逐渐得到更广泛的使用。个人也可以玩视频,音频制作VCD,SVCD,DVD甚至网上视频。 这些东西接触的多了也知道了视频图像压缩的必要。究竟视频图像为什么需要压缩呢!让我们看看下面两个原因吧! 
首先,传输数字图像所需的带宽远窄于未压缩图像。例如,NTSC图像以大约640 x 480的分辨率,24bits/象素,每秒30帧的质量传输时,其数据率达28M字节/秒或221M位/秒。此外,NTSC声音信号还要使未压缩图像的比特率再增加一些。然而单速CD-ROM(1x)驱动器只能以1.2M位/秒的速率传输数据。 
第二个原因是以28M字节/秒的速率,15秒的未压缩图像将占用420M字节的内存空间,这对于大多数只能处理小图像片断的台式计算机来说都是不可接受的。 
当今把图像加入电子信号的关键问题是压缩方式。有几种不同的压缩方式,但MPEG是最有市场潜力的压缩方式。 
MPEG的全称是Moving Pictures Experts Group(即动态图像专家组),由ISO(International Standards Organization,国际标准化组织)与IEC(International Electronic Committee)于1988年联合成立,致力于运动图像(MPEG视频)及其伴音编码(MPEG音频)标准化工作。MPEG共有4个版本,其中前两个版本MPEG-1和MPEG-2应用比较广泛,而MPEG-4虽然已推出近两年,但有关它的应用却直到最近才活跃起来,MPEG-7则是属于未来的标准。 
 MPEG-1标准(ISO/IEC11172)制定于1992年,是针对1.5Mbps以下数据传输率的数字存储媒体运动图像及其伴音编码设计的国际标准,主要用于在CD-ROM(包括Video-CD、CD-I等)存储彩色的同步运动视频图像,它针对SIF(标准交换格式)标准分辨率(NTSC制为352×240;PAL制为352×288)的图像进行压缩,每秒可播放30帧画面,具备CD(指激光唱盘)音质。同时,它还被用于数字电话网络上的视频传输,如非对称数字用户线路(ADSL)、视频点播(VOD)、教育网络等。 它的目的是把221Mbit/秒的NTSC图像压缩到1.2Mbit/秒,压缩率为200:1。使用MPEG-1的压缩算法,可以将一部120分钟长的电影压缩到1.2GB左右,因此,它被广泛地应用于VCD制作和一些视频片段的下载,目前90%以上的VCD都是用MPEG-1格式压缩的。目前一些制作VCD的采集压缩卡,像SNAZII DVC,MP 10,白老汇等都是采用MPEG-1压缩标准。 
  MPEG-2用于宽带传输的图像,图像质量达到电视广播甚至HDTV的标准。和MPEG-1相比,MPEG-2支持更广的分辨率和比特率范围,将成为数字图像盘(DVD)和数字广播电视的压缩方式。这些市场将和计算机市场交织在一起,从而使MPEG-2成为计算机的一种重要的图像压缩标准。MPEG-2标准ISO/IEC13818)制定于1994年,是针对3~10Mbps的数据传输率制定的的运动图像及其伴音编码的国际标准。MPEG-2可以提供一个较广的范围改变压缩比,以适应不同画面质量、存储容量和带宽的要求。它在与MPEG-1兼容的基础上实现了低码率和多声道扩展:MPEG-2可以将一部120分钟长的电影压缩到4~8GB(它提供的是我们通常所说的DVD品质),其音频编码可提供左右中及两个环绕声道、一个加重低音声道和多达7个伴音声道(因此DVD可有8种语言配音)。除了作为DVD的指定标准外,MPEG-2还可用于为广播、有线电视网、电缆网络等提供广播级的数字视频。不过对普通用户来说,由于现在电视机分辨率的限制,MPEG-2所带来的高清晰度画面质量(如DVD画面)在电视上效果并不明显,倒是其音频特性(如加重低音、多伴音声道等)得到了广泛的应用。 MP3是应用于MPEG-1的一项音频压缩技术标准,英文全称是MPEG-1 Audio Layer3。做出这个定义的依据是:第一,MPEG官方已经明确表示,MP3和MPEG-1 Audio Layer3是指同一件事情。第二、Layer技术的发布者Fraunhofer IIS-A〔注1〕官方技术文档中也提到过,MP3就是MPEG-1 Audio Layer3。此外,在很多知名厂商比如SONY、Philips的一些相关技术文档中也直接说明了MP3是MPEG-1 Audio Layer3的问题(参考相应技术部分)。 
   
MPEG-3是ISO/IEC最初为HDTV(高清晰电视广播)制定的编码和压缩标准,但由于MPEG-2的出色性能已能适用于HDTV,因此MPEG-3标准并未制定,我们通常所说的MP3指的是MPEG Layer 3,只是MPEG的一个音频压缩标准。 
   
令人称道的MPEG-4 
  MPEG-4于1998年11月公布,预计投入使用的国际标准MPEG-4是针对一定比特率下的视频、音频编码,更加注重多媒体系统的交互性和灵活性。为此,MPEG-4引入了AV对象(Audio/Visual Objects),使得更多的交互操作成为可能: 
  “AV对象”可以是一个孤立的人,也可以是这个人的语音或一段背景音乐等。它具有高效编码、高效存储与传播及可交互操作的特性。 
  MPEG-4对AV对象的操作主要有:采用AV对象来表示听觉、视觉或者视听组合内容;组合已有的AV对象来生成复合的AV对象,并由此生成AV场景;对AV对象的数据灵活地多路合成与同步,以便选择合适的网络来传输这些AV对象数据;允许接收端的用户在AV场景中对AV对象进行交互操作等。 
   
MPEG-4标准则由6个主要部分构成: 

1 DMIF(The Dellivery Multimedia Integration Framework) 
DMIF 即多媒体传送整体框架,它主要解决交互网络中、广播环境下以及磁盘应用中多媒体应用的操作问题。 通过传输多路合成比特信息来建立客户端和服务器端的交互和传输。 通过DMIF,MPEG4可以建立起具有特殊品质服务(QoS)的信道和面向每个基本流的带宽。 
2 数据平面 
MPEG4中的数据平面可以分为两部分:传输关系部分和媒体关系部分。 
为了使基本流和AV对象在同一场景中出现,MPEG4引用了对象描述(OD)和流图桌面(SMT) 的概念。OD 传输与特殊AV对象相关的基本流的信息流图。桌面把每一个流与一个CAT(Channel Assosiation Tag)相连,CAT可实现该流的顺利传输。 
3 缓冲区管理和实时识别 
MPEG4定义了一个系统解码模式(SDM),该解码模式描述了一种理想的处理比特流句法语义的解码装置,它要求特殊的缓冲区和实时模式。通过有效地管理,可以更好地利用有限的缓冲区空间。 
4 音频编码 
MPEG4的优越之处在于——它不仅支持自然声音,而且支持合成声音。MPEG4的音频部分将音频的合成编码和自然声音的编码相结合,并支持音频的对象特征。 
5 视频编码 
与音频编码类似,MPEG4也支持对自然和合成的视觉对象的编码。 合成的视觉对象包括2D、3D 动画和人面部表情动画等。 
6 场景描述 
MPEG4提供了一系列工具,用于组成场景中的一组对象。一些必要的合成信息就组成了场景描述,这些场景描述以二进制格式BIFS(Binary Format for Scene description)表示,BIFS与AV对象一同传输、编码。场景描述主要用于描述各AV对象在一具体AV场景坐标下,如何组织与同步等问题。同时还有AV对象与AV场景的知识产权保护等问题。MPEG4为我们提供了丰富的AV场景。 
MPEG-4的应用 
  与MPEG-1和MPEG-2相比,MPEG-4更适于交互AV服务以及远程监控,它的设计目标使其具有更广的适应性和可扩展性: MPEG-4传输速率在4800-64000bps之间,分辨率为176×144,可以利用很窄的带宽通过帧重建技术压缩和传输数据,从而能以最少的数据获得最佳的图像质量。因此,它将在数字电视、动态图像、互联网、实时多媒体监控、移动多媒体通信、Internet/Intranet上的视频流与可视游戏、DVD上的交互多媒体应用等方面大显身手。 
  当然,对于普通用户来说,MPEG-4在目前来说最有吸引力的地方还在于它能在普通CD-ROM上基本实现DVD的质量:用MPEG-4 压缩算法的ASF(Advanced Streaming format,高级格式流)可以将120分钟的电影压缩为300MB左右的视频流;采用MPEG-4压缩算法的DIVX 视频编码技术可以将120分钟的电影压缩600MB左右,也可以将一部 DVD影片压缩到 2 张 CD-ROM上!也就是说,有了MPEG-4,你不需要购买 DVD-ROM 就可以享受到和它差不多的视频质量!播放这种编码的影片对机器的要求并不高:只要你的电脑有300MHz 以上(无论是哪种型号)的CPU、64MB内存、8MB的显卡就可以流畅地播放。 

  不过,和DVD相比,MPEG-4属于一种高比率有损压缩算法,其图像质量始终无法和DVD的MPEG-2相比,毕竟DVD的存储容量比较大。此外,要想保证高速运动的图像画面不失真,必须有足够的码率,目前MPEG-4的码率虽然可以调到和DVD差不多,但总体效果还有不小的差距。因此,现在的MPEG-4只能面向娱乐、欣赏方面的市场,那些对图像质量要求较高的专业视频领域暂时还不能采用。 
旅行者 http://www.cnblogs.com/shenghuafen/articles/23392.aspx Mon, 12 Jul 2004 05:26:00 GMThttp://www.cnblogs.com/shenghuafen/articles/23392.aspxhttp://www.cnblogs.com/shenghuafen/articles/23392.aspx#Feedback0http://www.cnblogs.com/shenghuafen/comments/commentRss/23392.aspx http://www.cnblogs.com/shenghuafen/services/trackbacks/23392.aspx   
MPEG-4技术的应用将使当前很多提供声音和数据服务的系统得到进一步的扩展,根据涉及ISO标准的版本、部分、类(profile)和等级(level)的不同,MPEG-4对应不同的技术。本文将讨论所有不同的MPEG-4技术,研究MPEG-4的需求、架构和实现策略,并讨论计算需求以更好地理解MPEG-4的实现。 
MPEG-4标准活动开始于1995年,至今还在不断发展之中。此标准由如表所示的16部分组成,本文将详细讨论该标准的第二和第十部分,这两部分是关于视频编码处理。在很多出版物中经常出现MPEG-4,但常常并没有严格区分出MPEG-4到底是用软件还是硬件来实现的,本文试图更明确阐述“MPEG-4”这个术语。有关MPEG句法的一部分新版本使标准实现向后兼容,这是MPEG-4的第二部分。在新的不能后向兼容的技术引入MPEG标准后,在2001-2003期间又创建了MPEG-4的第10部分,即高级视频编码(AVC)。 
标准的创建需要通过工作草案(WD)、委员会草案(CD)、最终委员会草案(FCD)、草案国际标准(DIS)、最终草案国际标准(FDIS)和最终国际标准(IS)这一系列过程,在该过程中伴随着技术的汇集、融合和应用。标准的修正通常都会增加更多的类,MPEG-4的第二版修正1和2就增加了FGS类,而修正3又增加了简单可扩展level 0和高级简单可扩展level 3b。MPEG的类规定了用于协同操作点(interoperability point)的技术,等级规定了一个类的范围或大小。此外,MPEG还定义了码流和解码器的一致性问题,但并没有直接规定解码器的功能。 
压缩技术与MPEG-4 
为了更好地理解类和等级,先了解MPEG-4的简单类(Simple profile)和核心类(Core file)。简单类采用矩形I帧和P帧,具有基于运动补偿离散余弦变换(DCT)基本功能的编码处理。I帧为帧内编码,而P帧为帧间编码,这两类编码方式是为了降低冗余信息。核心类可以采用I帧、P帧和B帧视频对象平面(VOP),并具有采用二进制形状定义的任意形状编码功能。因此,如果采用核心类则必须开发出一种形状自适应DCT来实现与核心类的互操作,而在简单类中需要采用标准的8×8 DCT技术。 
在MPEG的术语中,等级表示在一个类中的参数范围。一些重要参数有:对象数量、量化表数量、视频复杂度验证子(VCV)缓冲大小、VCV解码器速率(单位:kbps)。缓冲器大小和速度的限制,以及类采用的技术所规定的操作点(operate point)都明确定义了该类适合的应用领域。例如,假如互联网流媒体联盟(ISMA 1.0)决定在两个操作点之间的互操作,对于视频部分他们可以选择[email=Simple@Level1]Simple@Level1[/email]和Advanced [email=Simple@Level3]Simple@Level3[/email]。开发工程师可以根据所要求的信道码率和处理要求,选择一个最具成本效益的类和等级。 
MPEG-4复杂度变化 
随着数字视频的广泛应用,目前已经存在多种不同的MPEG-4解决方案复杂度。由于存在好几种不确定因素,使得在设计一个复杂的视频编解码器之前很难确定真正所需要的计算能力。由于MPEG参考代码的编制过程中会有若干公司和会员单位参与,尽管代码在功能上是正确的,但在实时性和存储器管理上并没有实现优化。事实上,MPEG-4有第5部分的参考软件和第7部分的优化参考软件。即使是优化的参考软件,由于它必须避免采用特定供应商的处理器代码,因而比商业解决方案还是慢3到5倍。目前有两个独立于处理器的评估工具可以帮助评估MPEG参考代码的复杂度:IMEC公司的Atomium工具评估软件的内存转移情况,而EPFL SIT工具以运营商的角度来评估最优化情况。这些评估工具的作用就是要给出在MPEG-4的类中的某项技术复杂程度的总体认识。 
在了解了不同的MPEG-4技术的计算复杂性之后,下一步就是要知道编码器和解码器需要处理的原始数据量,通过了解每秒中宏块数量就可以轻易地得到该数据。图1中列出了简单类的level 1到level 3,高级类的level 0到level 5,主类的level 2到level 4。值得注意的是,除了三个类的技术不同以外,不同操作点在单位时间内能处理的数量具有很大的差异。此外,如果包含了演播室类(Studio profile),这个范围可以达到每秒三百万个宏块。 
MPEG-4的实现 
假定你能够确定一个或一系列操作点,怎样才能实现实时操作呢?通过正确的MPEG-4技术的类估计,为满足类似于每秒内的宏块数的系统级参数的并行特性要求,将采用一种具有软件配合的视频管线架构(video pipeline architecture),FPGA可以提供这种必要的并行特性来实现实时的、具有成本效益的视频编解码器。考虑硅器件的MOPS(百万操作每秒)参数,目前有约2,000MOPS的通用处理器,而采用DSP处理器可以将这个数字提高到约8,000MOPS,但存在数据流由限运算单元处理的缺点。带有专用处理引擎的媒体处理器,如位运算单元可以将该参数提升到20,000MOPS,但FPGA和ASIC具有更高的设计自由度,可以扩展到100,000MOPS以上。 
FPGA基于SRAM技术的特点使其具有可再编程功能。因此,对于一个给定的FPGA设计可以支持几种操作点和不同的信道数,如图2所示。在必要的情况下,不同的MPEG-4技术还可以编程在同一个FPGA中,在不超出FPGA计算能力条件下,甚至还可能支持MPEG-4标准未来的类和等级。像ISMA这样的系统级要求经常具有不同的操作点以满足不同的应用需要,利用FPGA的重编程的特性可以开发出足不同市场需求的设备。 
H.26L中的量化 
H.26L中的整数转换 
帧内预测(intraprediction)编码
posted on 2010-05-17 16:32  一个人的天空@  阅读(1887)  评论(0编辑  收藏  举报