作业1.RGB与YUV互转&AVI文件格式详解&WAV文件格式详解

本文详细介绍了YUV与RGB颜色空间的转换原理,探讨了AVI和WAV文件的结构特点,包括它们如何组织音视频数据,并深入分析了这些文件格式在多媒体领域的应用。

Q1:YUV RGB空间的相互转换

      
RGB为物理三基色,它们是色度学计量中最基本的一套三基色。在兼容制彩色电视所传送的彩色信号中,必须包含一个携带亮度信息的亮度信号(Y)和两个直接携带色调饱和度信息的色度信号(R-Y和B-Y)。由电视原理可知, Y=0.2990 R+0.5870G+0.1140B,R-Y=0.7010R-0.5870G-0.1140B,B-Y=-0.2990R-0.5870G+0.8860B。 为了使色差信号的动态范围控制在0.5 之间,需要进行归一化,对色差信号引入压缩系数。归一化后的色差信号为:U=0.714(R-Y),V=0.562(B-Y)。

码电平分配及数字表达式


A.亮电平信号量化后码电平分配

在对分量信号进行8比特均匀量化时,共分为256个等间隔的量化级。为了防止信号变动造成过载,在256级上端留20级,下端留16级作为信号超越动态范围的保护带。

B.色差信号量化后码电平分配

色差信号经过归一化处理后,动态范围为-0.5-0.5,让色差零电平对应码电平128,色差信号总共占225个量化级。在256级上端留15级,下端留16级作为信号超越动态范围的保护带。

C.码电平数字表达式

亮度和色度量化后以后取其最邻近的整数作为码电平值,取量化比特数为8bit,其数字表达式为D=INT[(219Y+16)],D=INT[(224U+128)], D=INT[(224U+128)]。INT[]表示对[]中小数四舍五入。

色度格式

4:2:0格式是指色差信号U,V的取样频率为亮度信号取样频率的四分之一,在水平方向和垂直方向上的取样点数均为Y的一半。



Q2:AVI文件格式详解

AVI是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式,原先用于Microsoft Video for Windows (简称VFW)环境,现在已被Windows 95/98OS/2等多数操作系统直接支持。AVI格式允许视频和音频交错在一起同步播放,支持256色和RLE压缩,但AVI文件并未限定压缩标准, 因此,AVI文件格式只是作为控制界面上的标准,不具有兼容性,用不同压缩算法生成的AVI文件,必须使用相应的解压缩算法才能播放出来。常用的AVI播 放驱动程序,主要是Microsoft Video for WindowsWindows 95/98中的Video 1,以及Intel公司的Indeo Video
AVI文件采用的是RIFF文件结构方式,RIFFResource Interchange File Format,资源互换文件格式)是微软公司定义的一种用于管理windows环境中多媒体数据的文件格式,波形音频waveMIDI和数字视频AVI 都采用这种格式存储。构造RIFF文件的基本单元叫做数据块(Chunk),每个数据块包含3个部分,
14字节的数据块标记(或者叫做数据块的ID
2、数据块的大小
3、数据
 整个RIFF文件可以看成一个数据块,其数据块IDRIFF,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。RIFF块中包含一系列 的子块,其中有一种字块的ID"LIST",称为LISTLIST块中可以再包含一系列的子块,但除了LIST块外的其他所有的子块都不能再包含子 块。
RIFFLIST块分别比普通的数据块多一个被称为形式类型(Form Type)和列表类型(List Type)的数据域,其组成如下: 
14字节的数据块标记(Chunk ID
2、数据块的大小
34字节的形式类型或者列表类型
4、数据
AVI文件是目前使用的最复杂的RIFF文件,它能同时存储同步表现的音频视频数据。AVIRIFF块的形式类型是AVI,它包含3个子块,如下所述:
1、信息块,一个ID"hdrl"LIST块,定义AVI文件的数据格式。
2、数据块,一个ID"movi"LIST块,包含AVI的音视频序列数据。
3、索引块,ID"idxl"的子块,定义 "movi"LIST块的索引数据,是可选块。
信息块包含两个子块,即一个IDavih 的子块和一个ID strl LIST块。 


"avih"子块的内容可由如下的结构定义:

typedef struct 
{
 DWORD dwMicroSecPerFrame ; //显示每桢所需的时间ns,定义avi的显示速率
 DWORD dwMaxBytesPerSec; // 最大的数据传输率
 DWORD dwPaddingGranularity; //记录块的长度需为此值的倍数,通常是2048
 DWORD dwFlages; //AVI文件的特殊属性,如是否包含索引块,音视频数据是否交叉存储
 DWORD dwTotalFrame; //文件中的总桢数
 DWORD dwInitialFrames; //说明在开始播放前需要多少桢
 DWORD dwStreams; //文件中包含的数据流种类
 DWORD dwSuggestedBufferSize; //建议使用的缓冲区的大小,
 //通常为存储一桢图像以及同步声音所需要的数据之和
 DWORD dwWidth; //图像宽
 DWORD dwHeight; //图像高
 DWORD dwReserved[4]; //保留值
}MainAVIHeader;


"strl" LIST块用于记录AVI数据流,每一种数据流都在该LIST块中占有3个子块,他们的ID分别是"strh","strf", "strd"
"strh"子块由如下结构定义。

typedef struct 
{
 FOURCC fccType; //4字节,表示数据流的种类 vids 表示视频数据流
 //auds 音频数据流
 FOURCC fccHandler;//4字节 ,表示数据流解压缩的驱动程序代号
 DWORD dwFlags; //数据流属性
 WORD wPriority; //此数据流的播放优先级
 WORD wLanguage; //音频的语言代号
 DWORD dwInitalFrames;//说明在开始播放前需要多少桢
 DWORD dwScale; //数据量,视频每桢的大小或者音频的采样大小
 DWORD dwRate; //dwScale /dwRate = 每秒的采样数
 DWORD dwStart; //数据流开始播放的位置,以dwScale为单位
 DWORD dwLength; //数据流的数据量,以dwScale为单位
 DWORD dwSuggestedBufferSize; //建议缓冲区的大小
 DWORD dwQuality; //解压缩质量参数,值越大,质量越好
 DWORD dwSampleSize; //音频的采样大小
 RECT rcFrame; //视频图像所占的矩形
}AVIStreamHeader;


"strf"子块紧跟在"strh"子块之后,其结构视"strh"子块的类型而定,如下所述;如果 strh子块是视频数据流,则 strf子块的内容是一个与windows设备无关位图的BIMAPINFO结构,如下:

typedef struct tagBITMAPINFO
{
 BITMAPINFOHEADER bmiHeader;
 RGBQUAD bmiColors[1]; //颜色表
}BITMAPINFO;

typedef struct tagBITMAPINFOHEADER
{
 DWORD biSize;
 LONG biWidth;
 LONG biHeight;
 WORD biPlanes;
 WORD biBitCount;
 DWORD biCompression;
 DWORD biSizeImage;
 LONG biXPelsPerMeter;
 LONG biYPelsPerMeter;
 DWORD biClrUsed;
 DWORD biClrImportant;
}BITMAPINFOHEADER;


如果 strh子块是音频数据流,则strf子块的内容是一个WAVEFORMAT结构,如下:

typedef struct 
{
 WORD wFormatTag; 
 WORD nChannels; //声道数
 DWORD nSamplesPerSec; //采样率
 DWORD nAvgBytesPerSec; //WAVE声音中每秒的数据量
 WORD nBlockAlign; //数据块的对齐标志
 WORD biSize; //此结构的大小
}WAVEFORMAT


"strd"子块紧跟在strf子块后,存储供压缩驱动程序使用的参数,不一定存在,也没有固定的结构。"strl" LIST块定义的AVI数据流依次将 "hdrl " LIST 块中的数据流头结构与"movi" LIST块中的数据联系在一起,第一个数据流头结构用于数据流0,第二个用于数据流1,依次类推。
数据块中存储视频和音频数据流,数据可直接存于 "movi" LIST块中。数据块中音视频数据按不同的字块存放,其结构如下所述,音频字块"##wb"Wave 数据流);视频子块中存储DIB数据,又分为压缩或者未压缩DIB"##db"RGB数据流)和 "##dc"压缩的图像数据流)。


Q3:WAV文件格式详解

1 RIFF文件与WAV文件

Windows环境下,大部分多媒体文件都依循着一种结构来存放信息,称为资源互换文件格式(Resources Interchange File Format),简称RIFF。比如声音的WAV文件,视频的AVI文件,动画的MMM文件等均是由此结构衍生出来的.

RIFF是一种树状结构,其基本组成单位是chunk(即块),每个chunk由辨识码,数据大小和数据组成,如下图。可以看出,一个chunk的长度,就是数据的大小加上8Byte.

 

一般而言,chunk本身不允许内部再包含chunk,但有两个例外:以"RIFF"和以"UST"为辨识码的chunk。针对这两种chunk,RIFF又从原先的"裸数据"中切出4Byte作为"格式辨别码",如下图所示.

 

RIFF的树状结构有所了解之后,可以知道它相当于一个根目录,而格式辨识码则相当于具体的盘符如C:,D:等等.Windows下的各种多媒体文件格式就如同在磁盘机下规定只能存放怎样的目录,而在该目录下仅能存放何种数据.

2 WAV文件头

顾名思义,WAV就是波形音频文件(Wave Audio),是Windows中用来表示数字化声音的一种标准格式,其文件扩展名为.wav,是一种非常简单的RIFF文件,格式辨识码为"WAVE".整个WAV文件分成两部分:文件头和数据块.WAV格式文件主要有两种文件头.

2.1标准的44字节文件头

这种WAV是最简单的一种RIFF格式,包含两个chunk:<fmt—chunk>,<wave—data>,这两个子块都是一个WAV文件必须包含的.

 

RIFF WAVE Chunk

'RIFF'作为标示,然后紧跟着为size字段,size是整个wav文件大小减去IDSize所占用的字节数,FileLen - 8 =Size.然后是Type字段,'WAVE',表示是wav文件.结构定义如下:

 struct RIFF_HEADER

 {

char szRiffID[4];  // 'R','I','F','F'

DWORD dwRiffSize;

char szRiffFormat[4]; // 'W','A','V','E'

 };

Format Chunk

'fmt '作为标示.一般情况下Size16,此时最后附加信息没有;如果为18则最后多了2个字节的附加信息.主要由一些软件制成的wav格式中含有该2个字节的

 struct WAVE_FORMAT

{ WORD wFormatTag;

WORD wChannels;

DWORD dwSamplesPerSec;

DWORD dwAvgBytesPerSec;

WORD wBlockAlign;

WORD wBitsPerSample;};

 struct FMT_BLOCK

{ char  szFmtID[4]; // 'f','m','t',' '

DWORD  dwFmtSize;

WAVE_FORMAT wavFormat;};

为了产生出能够正确读出的WAV文件,必须严格注意以下几个分量间的特定关系,否则产生出的文件将无法正常播放。
2.2  58字节文件头

如果不是Windows的标准WAV文件,而是经过了一些软件处理的,往往就是58字节的文件头,如下图所示. 

 

它比44字节的多了一个fact子块.<fact—ck>储存了关于WAV文件内容的重要信息.该子块定义如下:

Fact Chunk

Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk.结构定义如下:

 struct FACT_BLOCK

{ char  szFactID[4]; // 'f','a','c','t'

DWORD  dwFactSize;};

3 "data"子块数据安排方式

"data"子块中装的是真正的声音数据.除非安装其它特殊软件,否则Windows目前仅提供WAVE_FORMAT_PCM一种数据格式,即脉冲编码调制(Pulse Code Modulation).针对此惭式,Windows中"data"子块中数据存放的形式如下图所示,根据声道数不同及取样位数的不同,安排4位的位置.
 
Data Chunk头结构定义如下:

struct DATA_BLOCK

{ char szDataID[4]; // 'd','a','t','a'

DWORD dwDataSize;};

Windows中将16位值的范围定为[-32768,32767].另外,0并不一定代表无声,而是由中间数值来决定,即8位的时候为128,l6位时0才是无声.所以,编程中需要放入无声的数据时,必须先认清声音格式是l6位还是8位. 通常解压缩后得到的文件仅仅是裸数据,不能正常播放声音.了解了WAV文件格式后,就可以按照标准的44字节格式,在解码数据前编写一个正确的WAV文件头,使其成为一个有效的WAV文件.


 







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值