已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
视频信息处理与传输题目:AVI、MPG、WMV、ASF、RM等视频文件格式和相应的结构体函数文件(C语言格式)摘要:视频是利用人的视觉暂留特性产生的动感可视媒体。根据视觉暂留原理,当静止图像以每秒2530帧的速度按一定顺序播放时,人眼是无法辨别单独的静态画面的,看上去是平滑连续的视觉效果。专门包含影像及同步声音信息等视频内容的文件叫视频文件,它一般分为影像文件(Video Forma)。随着计算机技术的迅猛发展和互联网的普及,多媒体信息的传播日益显示其重要的地位。大量的音频、视频、动画等多媒体文件的编码及播放成为人们研究的热点。虽然视频文件的格式有许多种,但从上面的简单说明里我们可以知道,这些格式文件的应用都有着两大使用环境,即本地播放和网络播放,因此根据这两大使用环境我们可以将视频格式分为影像文件格式(Video Format)和流式视频文件格式(Stream Video Format)这么两大类。本文介绍常用的视频文件格式,包括AVI、MPG、WMV、ASF、RM等视频文件格式及其C语言格式的结构体函数文件。关键字:视频文件格式、AVI、MPG、WMV、ASF、RM、结构体函数前言:从早期的幕布电影,发展到现在的高清晰数字影片,从媒体格式以前的WMV、WMA等也发展到如今RMVB、RM、AVI等主流媒体格式在IT领域,我们常说的“格式”通常指文件的格式、数据的输入输出格式、数据的传送格式等。科学技术的发展使得这些视频信息处理的应用日益广泛且向多元化发展。正文:一、AVI格式(Audio Video Interleaved,即音频视频交错格式):所谓“音频视频交错”,就是可以将视频和音频交织在一起进行同步播放,在AVI文件中,其便是将运动图像和伴音数据以交织的方式来进行存储地,并且这种存储完全独立于硬件设备,这就保证了它在不同平台下均可以获得较好的支持。AVI文件包含三部分: 文件头、数据块和索引块。数据块: 包含实际数据流, 即图像和声音序列数据。这是文件的主体, 也是决定文件容量的主要部分。视频文件的容量等于该文件的数据率乘以该视频播放的时间长度。索引块: 包括数据块列表和他们在文件中的位置, 以提供文件内数据随机存取能力。文件头: 包括文件的通用信息, 定义数据格式, 所用的压缩算法等参数。只要遵循这个标准,任何视频编码方案都可以使用在A V I文件中。这意味着 AV I 有着非常好的扩充性。AVI文件是一种RIFF( Resource Interchange File Format, 资源交换文件格式) 格式文件。1、信息块,一个ID为hdrl的LIST块,定义AVI文件的数据格式。2、数据块,一个ID为 movi的LIST块,包含AVI的音视频序列数据。3、索引块,ID为 idxl的子块,定义 moviLIST块的索引数据,是可选块。avih子块的内容可由如下的结构定义:typedef struct DWORD dwMicroSecPerFrame ; /显示每桢所需的时间ns,定义avi的显示速率DWORD dwMaxBytesPerSec; / 最大的数据传输率DWORD dwPaddingGranularity; /记录块的长度需为此值的倍数,通常是2048DWORD dwFlages; /AVI文件的特殊属性,如是否包含索引块,音视频数据是否交叉存储DWORD dwTotalFrame; /文件中的总桢数DWORD dwInitialFrames; /说明在开始播放前需要多少桢DWORD dwStreams; /文件中包含的数据流种类DWORD dwSuggestedBufferSize; /建议使用的缓冲区的大小,/通常为存储一桢图像以及同步声音所需要的数据之和DWORD dwWidth; /图像宽DWORD dwHeight; /图像高DWORD dwReserved4; /保留值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 tagBITMAPINFOBITMAPINFOHEADER bmiHeader;RGBQUAD bmiColors1; /颜色表BITMAPINFO;typedef struct tagBITMAPINFOHEADERDWORD 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; /此结构的大小WAVEFORMATstrd子块紧跟在strf子块后,存储供压缩驱动程序使用的参数,不一定存在,也没有固定的结构。strl LIST块定义的AVI数据流依次将 hdrl LIST 块中的数据流头结构与movi LIST块中的数据联系在一起,第一个数据流头结构用于数据流0,第二个用于数据流1,依次类推。数据块中存储视频和音频数据流,数据可直接存于 movi LIST块中。数据块中音视频数据按不同的字块存放,其结构如下所述,音频字块#wbWave 数据流视频子块中存储DIB数据,又分为压缩或者未压缩DIB,#dbRGB数据流 #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 Electronic Committee)于1988年联合成立,专门致力于运动图像(MPEG视频)及其伴音编码(MPEG音频)标准化工作。2.0Mpeg-1数据流分析2.1视频序列层(VideoStream):Video_Streamunsigned 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 intra_quant_matrix88; /* Quantization matrix for intracoded frames. */ unsigned char non_intra_quant_matrix88; /* Quanitization matrix for non intracoded frames. */ char *ext_data; /* Extension data. */ char *user_data; /* User data. */ GoP group; /* Current group of pict. */ Pict picture; /* Current picture. */ Slice slice; /* Current slice. */ Macroblock mblock; /* Current macroblock. */ Block block; /* Current block. */ int state; /* State of decoding. */ int bit_offset; /* Bit offset in stream. */ unsigned int *buffer; /* Pointer to next byte in buffer. */ int buf_length; /* Length of remaining buffer.*/ unsigned int *buf_start; /* Pointer to buffer start. */ int max_buf_length; /* Max lenght of buffer. */ PictImage *past; /* Past predictive frame. */ PictImage *future; /* Future predictive frame. */ PictImage *current; /* Current frame. */ PictImage *ringRING_BUF_SIZE; /* Ring buffer of frames. */ Video_Stream; 具体的序列标题的结构的部分是这样的:序列sequence_headerSEQ_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_matrix88; /* Quantization matrix for intracoded frames. 这个结构是可选的,要看 load_intra_quantizer_matrix的值,为真则有这个部分,否则没有,因为 intra_quant_matrix是量化表的值,而Sequence_header结构在视频序列中是可重复的,即在每个画面组之前都有可能再次给出一个sequence_header,并且可以在新的sequence_header 中重新定义量化表*/ unsigned char load_non_intra_quantizer_matrix; unsigned char non_intra_quant_matrix88; /* Quanitization matrix for non intracoded frames. 也是可选。愿意于intra_quant_matrix可选的原因相同。当load_non_intra_quant_matrix的值为真的时候需要定义。 */ char *ext_data; /* Extension data. */ char *user_data; /* User data. */由上面的分析,可以看出来的是:video_sequence() next_start_code() do 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 BOOLEAN drop_flag; /* Flag indicating dropped frame. */ unsigned int tc_hours; /* Hour component of time code. */ unsigned int tc_minutes; /* Minute component of time code. */ unsigned int tc_seconds; /* Second component of time code. */ unsigned int tc_pictures; /* Picture counter of time code. */ BOOLEAN closed_gop; /* Indicates no pred. vectors to previous group of pictures. */ BOOLEAN broken_link; /* B frame unable to be decoded. */ char *ext_data; /* Extension data. */ char *user_data; /* User data. */ GoP;当然每个画面组层都是开始与标志码:GOP_START_CODE该层次语法上的定义是group_of_pictures 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; /* Temporal reference. */ unsigned int code_type; /* Frame type: P, B, I */ unsigned int vbv_delay; /* Buffer delay. */ BOOLEAN full_pel_forw_vector; /* Forw. vectors specified in full pixel values flag. */ unsigned int forw_r_size; /* Used for vector decoding. */ unsigned int forw_f; /* Used for vector decoding. */ BOOLEAN full_pel_back_vector; /* Back vectors specified in full pixel values flag. */ unsigned int back_r_size; /* Used in decoding. */ unsigned int back_f; /* Used in decoding. */ char *extra_info; /* Extra bit picture info. */ char *ext_data; /* Extension data. */ char *user_data; /* User data. */ Pict;2.4片层(Slice):首先给出识别出Slice层数据的头标slice_start_code#define SLICE_MIN_START_CODE 0x00000101#define SLICE_MAX_START_CODE 0x000001afslice slice_start_code /*从中可以计算出slice_vertical_position 片中第一个宏块,以宏块为单位的垂直位置*/ quantizer_scale /*设置量化步长尺寸。131*/ 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; /* Vertical position of slice. */ unsigned int quant_scale; /* Quantization scale. */ char *extra_info; /* Extra bit slice info. */ Slice;2.5宏块层(Macroblock):macroblock() 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之间的差值。 最大值为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_codei(i=0:5),从而确定该宏块接收到的块的种类有哪些。*/ for(i=0;i6;i+) block(i) if(picture_coding_type=4) end_of_marcoblock片被分为16pixels*16lines的象素宏块。每个宏块都有它的标题。包含了宏块的地址、类型、量化器标尺信息等等。标题之后是该宏块的6个块的数据。在Xmplay代码中给出的macrblock的定义:typedef struct macroblock int mb_address; /* Macroblock address. */ int past_mb_addr; /* Previous mblock address. */ int motion_h_forw_code; /* Forw. horiz. motion vector code. */ unsigned int motion_h_forw_r; /* Used in decoding vectors. */ int motion_v_forw_code; /* Forw. vert. motion vector code. */ unsigned int motion_v_forw_r; /* Used in decdoinge vectors. */ int motion_h_back_code; /* Back horiz. motion vector code. */ unsigned int motion_h_back_r; /* Used in decoding vectors. */ int motion_v_back_code; /* Back vert. motion vector code. */ unsigned int motion_v_back_r; /* Used in decoding vectors. */ unsigned int cbp; /* Coded block pattern. */ BOOLEAN mb_intra; /* Intracoded mblock flag. */ BOOLEAN bpict_past_forw; /* Past B frame forw. vector flag. */ BOOLEAN bpict_past_back; /* Past B frame back vector flag. */ int past_intra_addr; /* Addr of last intracoded mblock. */ int recon_right_for_prev; /* Past right forw. vector. */ int recon_down_for_prev; /* Past down forw. vector. */ int recon_right_back_prev; /* Past right back vector. */ int recon_down_back_prev; /* Past down back vector. */ Macroblock;2.6块层(Block):typedef struct block short int dct_recon88; /* Reconstructed dct coeff matrix. */ short int dct_dc_y_past; /* Past lum. dc dct coefficient. */ short int dct_dc_cr_past; /* Past cr dc dct coefficient. */ short int dct_dc_cb_past; /* Past cb dc dct coefficient. */ Block;解析块的语法结构是:block(i) if(pattern_codei) if(macroblock_intra) if(i4) 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(WindowsMediaVideo): 采用独立编码方式并且可以直接在网上实时观看视频节目的文件压缩格式。WM V格式的主要优点包括: 相比MPEG 、VOB 格式同等画质时文件相对较小、本地或网络回放、可扩充的媒体类型、部件下载、 可伸缩的媒体类型、流的优先级化、多语言支持、环境独立性、丰富的流间关系以及扩展性。它是由 A SF( A dva n c ed S tr e a m For m at ) 格式升级延伸来的。在同等视频质量下, WM V格式的体积非常小 ( RM格式也特小,不同的技术相同的应用 ), 因此也很适合在网上播放和传输。头16个字节是固定的;接下来的8个字节为一个整数,表示整个WMA文件头部的大小;头部后面的是音频信息;从文件开始偏移量为31开始,里面存放了很多帧,有我们需要的标准Tag信息,扩展Tag信息,WMA文件控制信息等等。每个帧不是等长的,但是帧头是固定的24个字节,其中前16字节是用来标识这个帧的名字,后8个字节是用来表示这个帧(包括帧头)的大小。四、ASF(AdvancedStreamingformat):ASF是一种数据格式,音频,视频,图像以及控制命令脚本等多媒体信息通过这种格式,以网络数据包的形式传输,实现流式多媒体内容发布。ASF 头对象:文件属性对象(File Properties Object)-全局文件属性。流属性对象(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 提取公积金协议书范本
- 2026-2031年中国商用车市场投资前景预测研究报告
- 2026-2031年中国三氯氧钒市场竞争策略及投资可行性研究报告
- 教室设施免责协议书
- 2026-2031年中国牛仔布市场分析预测报告
- 护士消毒考题题库及答案
- 基于构件的软件再工程:理论、实践与展望
- 2026-2031全球及中国饭卡机行业现状分析与发展趋势研究报告
- 2026-2031全国大学生就业情况的调查报告
- 护士心理测评题库及答案
- 《房屋市政工程生产安全重大事故隐患判定标准(2024版)》解读
- 公路试验室租赁合同范本
- 2025年河北省公务员遴选考试题及答案
- 汇丰银行课件
- 2025年导游资格证考试押题试卷 导游业务与政策法规实战押题卷
- 科学研究和技术服务业职业发展研究报告
- 咖啡厅食品安全管理制度
- 企业人力资源审计重点
- 酒店安全巡查日常检查记录表
- 初中数学教师培训讲座
- 新版膳食指南2025电子版
评论
0/150
提交评论