资源描述
视频信息处理与传输
题目:AVI、MPG、WMV、ASR RM等视频文件格式
和相应的结构体函数文件(C语言格式)
摘要:视频是利用人的视觉暂留特性产生的动感可视媒体。根据视觉暂留原理 当静止图像以每秒25〜30帧的速度按一定顺序播放时,人眼是无法辨别单独的静 态画面的,看上去是平滑连续的视觉效果。专门包含影像及同步声音信息等视频 内容的文件叫视频文件,它一般分为影像文件(Video Forma)。
随着计算机技术的迅猛发展和互联网的普及 ,多媒体信息的传播日益显示其 重要的地位。大量的音频、视频、动画等多媒体文件的编码及播放成为人们研究 的热点。虽然视频文件的格式有许多种,但从上面的简单说明里我们可以知道, 这些格式文件的应用都有着两大使用环境, 即本地播放和网络播放,因此根据这
两大使用环境我们可以将视频格式分为影像文件格式( Video Format)和流式视
频文件格式(Stream Video Format)这么两大类。本文介绍常用的视频文件格式, 包括AVI、MPG、WMV、ASF RM等视频文件格式及其 C语言格式的结构体函数
关键字:视频文件格式、AVk MPG、WMV、ASR RM、结构体函数
前言:从早期的幕布电影,发展到现在的高清晰数字影片,从媒体格式以前的
WMV、WMA等也发展到如今RMVR RM、AVI等主流媒体格式在IT领域,我们 常说的“格式”通常指文件的格式、数据的输入输出格式、数据的传送格式等。 科学技术的发展使得这些视频信息处理的应用日益广泛且向多元化发展。
正文:
一、AVI格式(Audio Video Interleaved,即音频视频交错格式):所谓“音频视 频交错”,就是可以将视频和音频交织在一起进行同步播放,在 AVI文件中,其
便是将运动图像和伴音数据以交织的方式来进行存储地,并且这种存储完全独立 于硬件设备,这就保证了它在不同平台下均可以获得较好的支持。 AVI文件包含
三部分:文件头、数据块和索引块。 ①数据块:包含实际数据流,即图像和声音 序列数据。这是文件的主体,也是决定文件容量的主要部分。视频文件的容量等 于该文件的数据率乘以该视频播放的时间长度。 ②索引块:包括数据块列表和他
们在文件中的位置,以提供文件内数据随机存取能力。 ③文件头:包括文件的通 用信息,定义数据格式,所用的压缩算法等参数。只要遵循这个标准,任何视频编 码方案都可以使用在A V I文件中。这意味着 AV I有着非常好的扩充性。AVI文 件是一种RIFF( Resource Interchange资源交换文件格式)格式文件。1、信息块, 一个ID为"hdrl”的LIS蚀,定义AVI文件的数据格式。
2、数据块,一个ID为"movi"的LIST块,包含AVI的音视频序列数据。
3、索引块,ID为"idxl”的子块,定义"movi"LIST块的索引数据,是可选块。
"avih"子块的内容可由如下的结构定义:
typedef struct
{
DWORD dwMicroSecPerFrame ;显示每桢所需的时间 ns,定义avi的显示速率 DWORD dwMaxBytesPerSec; //最大的数据传输率
DWORD dwPaddingGranularity; /块录块的长度需为此值的倍数,通常是 2048 DWORD dwFlages;//AVfc件的特殊属性,如是否包含索引块,音视频数据是
否交叉存储
DWORD dwTotalFrame;彼件中的总桢数
DWORD dwInitialFrames; /说明在开始播放前需要多少桢
DWORD dwStreams; /文件中包含的数据流种类
DWORD dwSuggestedBufferSize;建议使用的缓冲区的大小,
//通常为存储一桢图像以及同步声音所需要的数据之和
DWORD dwWidth; 〃图像宽
DWORD dwHeight; /圈像高
DWORD dwReserved[4]; //^ 留值
}MainAVIHeader;
"strl" LIST块用于记录AVI数据流,每一种数据流都在该 LIS位中占有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子块是音频数据流,则stf子块的内容是一个 WAVEFORMA玷构, 如下:
typedef struct
{ /
WORD wFormatTag;
WORD nChannels;曲道数
DWORD nSamplesPerSec;采样率
DWORD nAvgBytesPerSec; //WAVE 音中每秒的数据量
WORD nBlockAlign; /的攵据块的对齐标志
WORD biSize; /此结构的大小
}WAVEFORMAT
“strd”子块紧跟在stf子块后,存储供压缩驱动程序使用的参数,不一定存 在,也没有固定的结构。
"strl" LIST块定义的AVI数据流依次将"hdrl " LIST块中的数据流头结构与 "movi" LIST块中的数据联系在一起,第一个数据流头结构用于数据流 0,第二个
用于数据流1,依次类推。
数据块中存储视频和音频数据流,数据可直接存于 "movi" LIST块中。数据
块中音视频数据按不同的字块存放,其结构如下所述,
音频字块
"##wb"
Wave数据流
视频子块中存储DIB数据,又分为压缩或者未压缩 DIB, "##db"
RGBR据流 "##dc" 压缩的图像数据流 (如果第一个流是音频,则4字符码为‘00wb';第二个流是视频,则4字符 码为'00db'或'00dc')..…(网上原话,可能是01db或01dc)
看到了吧,avi文件的图像数据可以是压缩的,和非压缩格式的。对于压缩 格式来说,也可采用不同的编码,也许你曾经遇到有些 avi没法识别,就是因为
编 码方式不一样,如果没有相应的解码,你就没法识别视频数据。AVI的编码方 式有很多种,比较常见的有 mpeg2, mpeg4, divx等。
索引块,索引快包含数据块在文件中的位置索引,能提高 avi文件的读写速
度,其中存放着一组AVIINDEXENTRY构数据。如下,这个块并不是必需的,也 许不存在。
typedef struct
{
DWORD ckid; /妃录数据块中子块的标记
DWORD dwFlags;侬示chid所指子块的属性
DWORD dwChunkOffset; /子块的相对位置
DWORD dwChunkLength;好块长度 };
二、MPG 又称 MPEG (Moving Pictures Experts Group)即动态图像专家组,由国 际标准化组织 ISO(International Standards Organization)? IEC(International
MPEG视频)
2.0Mpeg-1数据流分析
/* Horiz. size in pixels. */
/* Vert. size in pixels. */
/* Vert. size in mblocks. */
/* Horiz. size in mblocks. */
/* Code for aspect ratio. */
/* Code for picture rate. */
/* Bit rate. */
/* Minimum buffer size. */
/* Contrained parameter flag. */ /* Quantization matrix for
Electronic Committee)于1988年联合成立,专门致力于运动图像(
及其伴音编码(MPEG音频)标准化工作
2.1 视频序列层(VideoStream):
Video_Stream{
unsigned int h_size;
unsigned int v_size;
unsigned int mb_height;
unsigned int mb_width;
unsigned char aspect_ratio;
unsigned char picture_rate;
unsigned int bit_rate;
unsigned int vbv_buffer_size;
BOOLEAN const_param_flag;
unsigned char intra_quant_matrix[8][8]; intracoded frames. */
unsigned char non_intra_quant_matrix[8][8]; /* Quanitization matrix for
non intracoded frames. */ char *ext_data;
char *user_data;
GoP group;
Pict picture;
Slice slice;
Macroblock mblock;
Block block;
int state;
int bit_offset;
unsigned int *buffer;
int buf_length;
unsigned int *buf_start;
int max_buf_length;
PictImage *past;
PictImage *future;
PictImage *current;
/* Extension data. */
/* User data. */
/* Current group of pict. */
/* Current picture. */
/* Current slice. */
/* Current macroblock. */
/* Current block. */
/* State of decoding. */
/* Bit offset in stream. */
/* Pointer to next byte in buffer. */
/* Length of remaining buffer.*/
/* Pointer to buffer start. */
/* Max lenght of buffer. */
/* Past predictive frame. */
/* Future predictive frame. */
/* Current frame. */
PictImage *ring[RING_BUF_SIZE];
/* Ring buffer of frames. */
} Video_Stream;
具体的序列标题的结构的部分是这样的: 序列
sequence_header{
SEQ_START_CODE 0x000001b3:常量,作用使用来定位视频序列的序列头 */
unsigned int h_size; /* Horiz. size in pixels. :/
unsigned int v_size; /: Vert. size in pixels. :/
unsigned int mb_height; /: Vert. size in mblocks. :/
unsigned int mb_width; /* Horiz. size in mblocks. :/
unsigned char aspect_ratio; /* Code for aspect ratio. :/
unsigned char picture_rate; /* Code for picture rate. :/
unsigned int bit_rate; /* Bit rate. :/
unsigned int vbv_buffer_size; /* Minimum buffer size. :/
BOOLEAN const_param_flag; /* Contrained parameter flag. :/
unsigned char load_intra_quantizer_matrix;
unsigned char intra_quant_matrix[8][8]; /* Quantization matrix for intracoded frames. 这个结构是可选的,要看
load_intra_quantizer_matrix的值,为真则有这个部分,否则没有,因为
intra_quant_matrix是量化表的值,而Sequence_heade附构在视频序列中是可 重复的,即在每个画面组之前都有可能再次给出一个 sequence_header并且可以 在新的sequence_header中重新定义量化表:/
.
unsigned char load_non_intra_quantizer_matrix;
unsigned char non_intra_quant_matrix[8][8]; /* Quanitization matrix for non
intracoded frames.也是可选。愿意于 intra_quant_matrix可选的原因相同
load_non_intra_quant_matrix 的值为真的时候 char :ext_data;
char :user_data;
} 一
由上面的分析,可以看出来的是:
video_sequence()
{
next_start_code()
do
{
*/
/* Extension data.
/* User data.
*/
*/
sequence_header(); do
{
group_of_pictures() ; // 画面组
}while (nextbits()==GROUP_START_CODE) }while(nextbits()==SEQUENCE_HEADER_CODE)
SEQUENCE END CODE
};
2.2 画面组层(GOP):
typedef struct GoP {
/* Flag indicating dropped frame. :/
BOOLEAN drop_flag;
unsigned int tc_hours;
unsigned int tc_minutes;
unsigned int tc_seconds;
unsigned int tc_pictures;
BOOLEAN closed_gop;
group of pictures. */
BOOLEAN broken_link;
char *ext_data;
char *user_data;
} GoP;
当然每个画面组层都是开始与标志码:
该层次语法上的定义是
group_of_pictures
{ 一一
GOP START CODE
/* Hour component of time code. */ /* Minute component of time code. */ /* Second component of time code. */
/* Picture counter of time code. */
/* Indicates no pred. vectors to previous
/* B frame unable to be decoded. */
/* Extension data. */
/* User data. */
GOP_START_CODE
Time_code; tc_hours,tc_minutes,tc_seconds,tc_pictures
Closed_gop;
Broken_link;
Next_start_code;
If(nextbits==extension_start_code)
{
Extension_start_code;
While(nextbits()== " 0000 0000 0000 0000 0000 0001
Group_extension_data;
next_start_code()
}
if(nextbits==user_data_start_code)
{
user_data_start_code
while(nextbits()!= ' 0000 0000 0000 0000 0000 0001
{
user_data;
} .
next_start_code()
} 一 一
do {
picture()
}while(nextbits==picture_start_code)
2.3 画面层(Pictures): picture()
picture_start_code
temprol_reference /*时序编号,通常一组画面的编号都在 1024以内, 如果超过那么石1025幅画面出复位为0,重新计数。 */
picture_coding_type
vbv_delay/*对于固定比特率的视频流,vbv_delay用与解码过程开始和随 机存取之后,以保证在第一幅画面被显示之前,解房器 已经读到正确数
目的比特数。*/
if((picture_coding_type==2) || picture_coding_type==3)
{一 一 一 一
full_pel_foward_vector /*全象素前向矢量,给定前向矢量的精 度,在P和B画面血示题中出现*/ forward_f_code
} 一一
if(picture_coding_type==3)
{ 一 一
full_pel_backward_vector back_f_code } 一一
while(nextbits()== ' 1 ') { extra_bit_picture extra_information_picture
extra_bit_picture next_start_code if(nextbits()==extension_start_code) { extension_start_code
while(nextbits()!= ' 0000 0000 0000 0000 0000 0001 ’ )
{
picture_extension_data } next_start_code()
} 一 一
if(nextbits()==user_data_start_code)
{ 一一一
user_data_start_code
while(nextbits()!= ' 0000 0000 0000 0000 0000 0001 ’ )
{ user_data
} .
next_start_code()
do
slice()
}while(nextbits()==slice_start_code)
} 一 一
整个画面单元结构是这样的:
typedef struct pict { unsigned int temp_ref; unsigned int code_type; unsigned int vbv_delay;
BOOLEAN full_pel_forw_vector; pixel values flag. */
unsigned int forw_r_size;
unsigned int forw_f;
BOOLEAN full_pel_back_vector; pixel values flag. */
unsigned int back_r_size;
unsigned int back_f; char *extra_info; char *ext_data; char *user_data;
} Pict;
2.4 片层(Slice): 首先给出识别出
/* Temporal reference. */
/* Frame type: P, B, I */
/* Buffer delay. */
/* Forw. vectors specified in full
/* Used for vector decoding. */
/* Used for vector decoding. */
/* Back vectors specified in full
/* Used in decoding. */
/* Used in decoding. */
/* Extra bit picture info. */
/* Extension data. */
/* User data. */
Slice层数据的头标 slice start code
#define SLICE_MIN_START_CODE 0x00000101
#define SLICE_MAX_START_CODE 0x000001af slice
{
slice_start_code /*从中可以计算出 slice_vertical_position 片中第一个宏
块,以宏底单左的垂直位置*/ 一 一
quantizer_scale /*设置量化步长尺寸。1 — 31*/ while(nextbits()== ' 1 ')
{
extra_bit_slice '1'
extra_information_slice
} 一 一
extra_bit_scale '0'
do {
macroblock()
}while(nextbits()!= ' 0000 0000 0000 0000 0000 0000 ’ )
next_start_code() }
typedef struct slice {
unsigned int vert_pos;
unsigned int quant_scale; char *extra_info;
} Slice;
2.5 宏块层(Macroblock):
macroblock()
/* Vertical position of slice. */
/* Quantization scale. */
/* Extra bit slice info. */
{
while(nextbits()== ' 0000 0001 111 ’ ) {
macroblock_stuffing /*宏块填料,为了防止下溢出,由编码器填入
的数据,有它固定的11位bit格式就是‘0000 0001 111',当然 解决下溢出的方 法还有很多,编码器可以在标题之前就加入填料位,或者可以减小 quant_scale 获得更多的编码系数等等*/ /
}
while(nextbits()== ' 0000 0001 000 ′ )
{
macroblock_escape /* 固定模式的 bit 用,当 macroblock_address与 previous_macroblock_address的差大于33时将用到该码。 使得后继的
macroblock_increment 所表示白^值力口 33。
}
macroblock_address_increment /* 用于表示 macroblock_address和 previous_macorblock_ address^间的差值。4最大值为33,当前两者差大于33 时用macroblock_escape补充。Macroblock_address表示的是宏块在画面中的绝 对位置,最左上角的宏块的 macroblock_address为0,previous_macroblock_address 指示片中最后一个非跳空宏块的位置。一*/ 一 一
macroblock_type
if(macroblock_motion_forward) {
motion_horizontal_forward_code if((forward_f!=1) && (motion_horizontal_forward_code!=0)) motion_horizontal_forward_r motion_vertical_forward_code if((forward_f!=1) && (motion_vertical_forward_code!=0)) motion_vertical_forward_r
} 一 一 一
if(macroblock_motion_backward)
{
motion_horizontal_backward_code
if((backward_f!=1) && (motion_horizontal_backward_code!=0)) motion_horizontal_backward_r
motion_vertical_backward_code
if((backward_f!=1) && (motion_vertical_backward_code!=0)) motion_vertical_backward_r
if(macroblock_pattern)
coded_block_pattern /*可以得到宏块宏块的 pattern_code[i](i=0:5),从而确
定该宏块接很到的无的种类有哪些。*/ 一
for(i=0;i<6;i++)
block(i)
if(picture_coding_type==4)
end_of_marcoblock
} 一一
片被分为16pixels*16lines的象素宏块。每个宏块都有它的标题。包含了宏块的
地址、类型、量化器标尺信息等等。标题之后是该宏块的 6个块的数据。
在Xmplay代码中给出的 macrblock的定义:
typedef struct macroblock {
int mb_address;
int past_mb_addr;
int motion_h_forw_code;
unsigned int motion_h_forw_r;
int motion_v_forw_code;
unsigned int motion_v_forw_r;
int motion_h_back_code;
unsigned int motion_h_back_r;
int motion_v_back_code;
unsigned int motion_v_back_r;
unsigned int cbp;
BOOLEAN mb_intra; <
BOOLEAN bpict_past_forw;
BOOLEAN bpict_past_back;
int past_intra_addr;
int recon_right_for_prev;
int recon_down_for_prev;
int recon_right_back_prev;
int recon_down_back_prev;
} Macroblock;
2.6 块层(Block):
typedef struct block
{
short int dct_recon[8][8];
short int dct_dc_y_past;
short int dct_dc_cr_past;
short int dct_dc_cb_past;
} Block;
解析块的语法结构是:
block(i)
{
/* Macroblock address. */
/* Previous mblock address. */
/* Forw. horiz. motion vector code. */
/* Used in decoding vectors. */
/* Forw. vert. motion vector code. */ /* Used in decdoinge vectors. */
/* Back horiz. motion vector code. */
/* Used in decoding vectors. */
/* Back vert. motion vector code. */
/* Used in decoding vectors. */
/* Coded block pattern. */
/* Intracoded mblock flag. */
/* Past B frame forw. vector flag. */
/* Past B frame back vector flag. */
/* Addr of last intracoded mblock. */
/* Past right forw. vector. */
/* Past down forw. vector. */
/* Past right back vector. */
/* Past down back vector. */
/* Reconstructed dct coeff matrix. */
/* Past lum. dc dct coefficient. */
/* Past cr dc dct coefficient. */
/* Past cb dc dct coefficient. */
if(pattern_code[i])
if(macroblock_intra) {
if(i<4)
{
dct_dc_size_luminance if(dc_size_luminance!=0) dct_dc_differential } 一一 else
{
dct_dc_size_chrominance if(dc_size_chrominance!=0) dct_dc_differential } 一一
} else { dct_coeff_first }
if(picture_coding_type!=4)
{ 一 一
while(nextbits()!= ' 10')
dct_coeff_next end_of_block } 一一
}
}
2.7加密位置的思考。
三、WMV (Windows Media Video ):采用独立编码方式并且可以直接在网上实 时观看视频节目的文件压缩格式。WM V格式的主要优点包括:相比MPEG、VOB 格式同等画质时文件相对较小、本地或网络回放、可扩充的媒体类型、部件下载、 可伸缩的媒体类型、流的优先级化、多语言支持、环境独立性、丰富的流间关系 以及扩展性。它是由 A SF( A dva n c ed S tr e a m For m at格式升级延伸来的。 在同等视频质量下,WM V格式的体积非常小(RM格式也特小,不同的技术相同 的应用),因此也很适合在网上播放和传输。
①头16个字节是固定的;②接下来的8个字节为一个整数,表示整个 WM度件 头部的大小;③头部后面的是音频信息;④从文件开始偏移量为 31开始,里面 存放了很多帧,有我们需要的标准 Tag信息,扩展Tag信息,WMA:件控制信息 等等。每个帧不是等长的,但是帧头是固定的24个字节,其中前16字节是用来 标识这个帧的名字,后8个字节是用来表示这个帧(包括帧头)的大小。
四、ASF (Advanced Streaming format): ASF 是一种数据格式,音频,视频,图 像以及控制命令脚本等多媒体信息通过这种格式, 以网络数据包的形式传输,实
现流式多媒体内容发布。ASF头对象:
①文件属性对象(Object) ----全局文件属性。
②流属性对象(Stream Properties Object ----定义一个媒体流和其属性。
③内容描述对象(Content Description Object) ----包含所有目录信息。
④部件下载对象(Component Download Object) ----提供播放部件信息。
⑤流组织对象(Stream Groups Object ----逻辑上把多个媒体流组织在一起。
⑥可伸缩对象(Scalable Object ----定义媒体流之间的可伸缩的关系。
⑦优先级对象(Prioritization Object) ----定义相关流的优先级。
⑦相互排斥对象(Mutual Exclusion Object)--定义排斥关系如语言选择。
⑧媒体相互依赖对象(Inter-Media Dependency Object) ----定义混合媒体流之间 的相互依赖关系。
⑨级别对象(Rating Object) ----根据W3c PICSS义文件的级别。
⑩索引参数对象(Index Parameters Object ----提供必要的信息以重建 ASFi件 的索引。
数据类型:
① typedef struct tagB
展开阅读全文
相关搜索