0
点赞
收藏
分享

微信扫一扫

第三次作业 AVI文件及WAV文件分析

吴陆奇 2022-03-30 阅读 96
开发语言


AVI文件格式概述

AVI(Audio Video Interleaved),即音频视频交错格式。是将语音和影像同步组合在一起的文件格式。它对视频文件采用了一种有损压缩方式,但压缩比较高,因此尽管画面质量不是太好,但其应用范围仍然非常广泛。AVI支持256色和RLE压缩。AVI信息主要应用在多媒体光盘上,用来保存电视、电影等各种影像信息。

AVI是一种RIFF(Resource Interchange File Format的缩写)文件格式,多用于音视频捕捉、编辑、回放等应用程序中。通常情况下,一个AVI文件可以包含多个不同类型的媒体流(典型的情况下有一个音频流和一个视频流),不过含有单一音频流或单一视频流的AVI文件也是合法的。AVI可以算是Windows操作系统上最基本的、也是最常用的一种媒体文件格式。

RIFF(Resource Interchange File Format,资源互换文件格式)是微软公司定义的一种用户管理Windows环境中多媒体数据的文件格式,波形音频wave,MIDI和数字视频AVI都采用这种格式存储。RIFF文件的实际数据中,使用了列表(List)和块(Chunk)的形式来组织。列表可以嵌套列表和块。整个RIFF文件可以看成一个数据库,其数据块ID为RIFF ,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。RIFF块中包含一系列的子块,其中有一种子块的ID为“List”,称为LIST块,LIST块中可以再包含一系列的子块,但除了LIST块外的其他所有的子块都不能再包含子块。
RIFF和LIST块分别比普通的数据块多了一个被称为形式类型(Form Type)或者列表类型(List Type)的数据域。

AVI文件格式结构

RIFF块:

52 49 46 46  Chunk ID(字符串“ RIFF”)
E2 37 D1 01 Chunk Len (文件大小 )
41 56 49 20  Chunk type( 文件类型“AVI”)
AVI文件大小(RIFF块大小 ) = Chunk Len (值)+ 4字节(Chunk ID)+ 4字节(Chunk Len)

LIST块:

4c 49 53 54  Chunk ID(字符串“LIST”)
24 01 00 00  Chunk Len(LIST数据长度),从Chunk type开始算
68 64 72 6C  Chunk type (“hdrl”)
61 76 69 68…78 FE 36 17(LIST实际数据)
LIST块大小 = Chunk Len (值)+ 4字节(Chunk ID)+ 4字节(Chunk Len)

Chunk块(普通块avih strh strf  idxl)

61 76 69 68 Chunk ID(字符串“avih”)
38 00 00 00 Chunk Len (文件大小 = 50)
56 82 00 00…78 FE 36 17 Chunk data(数据)
Chunk 块大小 = 实际的实况数据长度,而不包括Chunk ID域和Chunk Len域本身的大小。

AVI文件层次划分

 avih 列表

typedef struct{
        DWORD  Chunk ID;   // 必须为‘avih’
        DWORD  Chunk Len;    // 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
        DWORD  dwMicroSecPerFrame;   // 视频帧间隔时间(以毫秒为单位)
        DWORD  dwMaxBytesPerSec;     // 这个AVI文件的最大数据率
        DWORD  dwPaddingGranularity; // 数据填充的粒度
        DWORD  dwFlags;         // AVI文件的全局标记,比如是否含有索引块等
        DWORD  dwTotalFrames;   // 总帧数
        DWORD  dwInitialFrames; // 为交互格式指定初始帧数(非交互格式应该指定为0)
        DWORD  dwStreams;       // 本文件包含的流的个数
        DWORD  dwSuggestedBufferSize; // 建议读取本文件的缓存大小(应能容纳最大的块)
        DWORD  dwWidth;         // 视频图像的宽(以像素为单位)
        DWORD  dwHeight;        // 视频图像的高(以像素为单位)
        DWORD  dwReserved[4];   // 保留
    } AVIMAINHEADER;

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子块是视频数据流)

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;

idxl列表

 typedef struct _avioldindex {
         DWOED   Chunk ID;  // 必须为‘idxl’
         DWORD   Chunk Len;   // 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
         struct _avioldindex_entry {
             DWORD   dwChunkId;   // 表征本数据块的四字符码
             DWORD   dwFlags;     // 说明本数据块是不是关键帧、是不是‘rec ’列表等信息
             DWORD   dwOffset;    // 本数据块在文件中的偏移量
             DWORD   dwSize;      // 本数据块的大小
         } aIndex[]; // 这是一个数组!为每个媒体数据块都定义一个索引信息
     } AVIOLDINDEX;

一、WAV文件格式概述

WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几! WAV打开工具是WINDOWS的媒体播放器.

二、WAV文件格式结构

WAV文件的文件头

偏移地址

大小

字节

数据块

类型

内容

00H~03H

4

4字符

资源交换文件标志(RIFF)

04H~07H

4

长整数

从下个地址开始到文件尾的总字节数

08H~0BH

4

4字符

WAV文件标志(WAVE)

0CH~0FH

4

4字符

波形格式标志(fmt ),最后一位空格。

10H~13H

4

整数

过滤字节(一般为00000010H)

14H~15H

2

整数

格式种类(值为1时,表示数据为线性PCM编码)

16H~17H

2

整数

通道数,单声道为1,双声道为2

18H~1BH

4

长整数

采样频率

1CH~1FH

4

长整数

波形数据传输速率(每秒平均字节数)

20H~21H

2

整数

DATA数据块长度,字节。

22H~23H

2

整数

PCM位宽

24H~27H44字符

"fact",该部分一下是可选部分,即可能有,可能没有,一般到WAV文件由某些软件转换而成时,包含这部分。

28H~2BH4

长整数

size,数值为4

WAV声音文件的数据块

偏移地址

字节数

类型

内容

24H~27H

4

4字符

数据标志符(data)

28H~2BH

4

长整型

DATA总数据长度字节

2CH...

...

DATA数据块

1.WAV文件结构层次

RIFF WAVE Chunk、Format Chunk、Fact Chunk(可选)、Data Chunk

2.WAV文件格式实例分析

 

偏移地址字节数数据类型内容
00H4char“RIFF”;   RIFF标志
04H4long int0x00 06 D0 92 (注意数据存储顺序);   文件长度
08H4char“WAVE”;   WAVE标志
0CH4char“fmt ”;   fmt标志,最后一位为空
10H4long int0x12;   sizeof(PCMWAVEFORMAT)
14H2int1WAVE_FORMAT_PCM;  格式类别,1表示为PCM形式的声音数据
16H2int2;  通道数,单声道为1,双声道为2
18H4int48000;  采样频率(每秒样本数)
1CH4long int每秒数据量;其值为通道数×每秒数据位数×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。
20H2int数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
22H2int每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。
24H4char“data”;   数据标记符
28H4long int0x00 00 00 00;   语音数据大小

参考:

avi文件格式简介_Gorgr的博客-CSDN博客

WAV文件格式分析_pyundeng的博客-CSDN博客

举报

相关推荐

第三次作业

Ansible第三次作业

第三次Java作业

Java第三次作业

Java的第三次作业

数据压缩第三次作业

操作系统第三次作业

数据库第三次作业

0 条评论