一、AVI文件简介

  AVI英文全称为Audio Video Interleaved,Audio/Video Interleaved(视音频交织),用于采集、编辑、播放的RIFF文件,由信息块,数据块,索引块组成。
  AVI文件将音频(语音)和视频(影像)数据包含在一个文件容器中,允许音视频同步回放。类似DVD视频格式,AVI文件支持多个音视频流。AVI信息主要应用在多媒体光盘上,用来保存电视、电影等各种影像信息。

AVI文件格式是基于RIFF(资源交换文件格式)文档格式。RIFF文件由RIFF标头组成,后跟零个或多个列表和区块

  • RIFF标头具有以下形式:

    'RIFF' fileSize fileType (data)

    其中,“RIFF"是文本 FOURCC 代码"RIFF”,是一个 4 字节值,表示文件中数据的大小,是标识特定文件类型的fileSize fileType FOURCC。 的值包括 FOURCC 的大小以及以下数据的大小,但不包括 fileSize fileType "RIFF"FOURCC 的大小或 的大小 fileSize 。 文件数据按任何顺序由区块和列表组成。

  • RIFF区块具有以下形式:

    ckID ckSize ckData

    其中,“ckID”是标识区块中包含的数据的 FOURCC,是一个 4 字节值,表示 中数据的大小,是 ckID ckSize ckData ckData 零个或多个数据字节。 数据始终填充到最近的 WORD 边界。 ckSize 提供区块中有效数据的大小;它不包括填充、的大小 ckID 或 的大小 ckSize

  • RIFF列表具有以下形式:

    'LIST' listSize listType listData

    其中,“LIST"是文本 FOURCC 代码"LIST”,是提供列表大小的 4 字节值,是 FOURCC 代码,由区块或列表组成( listSize listType 按任何 listData 顺序)。"LIST"的值包括 listSize 的大小加上 的大小 listType listData ;它不包括 “LIST” FOURCC 或 的大小 listSize

本部分的其余部分使用下列表示法来描述 RIFF 区块:

ckID ( ckData )

其中区块大小是隐式的。 使用此表示法,列表可以表示为:

'LIST' ( listType ( listData ) )

可选元素位于方括号中: [ optional element ]

AVI文件结构

RIFF ('AVI 'LIST ('hdrl''avih'(<Main AVI Header>)LIST ('strl''strh'(<Stream header>)'strf'(<Stream format>)[ 'strd'(<Additional header data>) ][ 'strn'(<Stream name>) ]...)...)LIST ('movi'{SubChunk | LIST ('rec 'SubChunk1SubChunk2...)...}...)['idx1' (<AVI Index>) ])

二、RIFF

  结构

  1. "RIFF"表示字符串
  2. RIFF大小
  3. 形式类型或者列表类型
  4. 数据
名称 字节数 说明
FOURCC 代码 4 0x52 49 46 46 “RIFF”
大小 4 大小=实际数据长度+4
形式类型或列表类型 4 0x41 56 49 20 “AVI”
数据

验证:

三、LIST

结构

  1. “LIST”表示字符串
  2. LIST列表大小
  3. 形式类型或者列表类型
  4. LIST实际数据
名称 字节数 说明
FOURCC 代码 4 0x4C 49 53 54 “RIFF”
列表大小 4 大小=实际列表数据长度+4
形式类型或列表类型 4 0x68 64 72 6C

0x6D 6F 76 69
“hdrl”

”movi“
数据 里面可能包含LIST嵌套
LIST里面音频视频分开存放

“hdrl”: 用于描述AVI文件中各个流的格式信息(AVI文件中的每一路媒体数据都称为一个流)。此列表里嵌套了一系列块和子列表。块中包含一个avih块,用于记录AVI文件的全局信息。子列表中包含一个或多个strl子列表。文件中有多少流,就对应多少个strl子列表,一般有视频流和音频流。

"movi"列表: 用于保存真正的媒体流数据,视频图像帧数据或音频采样数据等

验证

hdrl LIST

avih LIST

avih块用于记录AVI文件的全局信息,比如流的数量、视频图像的宽和高等。

avih块结构: AVIMAINHEADER数据结构

typedef struct _avimainheader {undefinedFOURCC fcc;   // 必须为‘avih’DWORD  cb;    // 本数据结构的大小,不包括最初的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;

验证

strl LIST

每个strl列表至少包含一个strh(音视频流的概要信息,包括流类型,解码类型等)和一个strf(视频流是BIMAPINFO结构,音频流是WAVEFORMAT结构,包括声道,采样率),还可以包含strd(保存编解码器需要的一些配置信息)和strn块(保存流的名字)。

strh LIST

strh LIST主要是说明流的头信息(音视频流的概要信息,包括流类型,解码类型等)。

strh结构: AVISTREAMHEADER数据结构

typedef struct _avistreamheader {undefinedFOURCC fcc;  // 必须为‘strh’DWORD  cb;   // 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)FOURCC fccType;    // 流的类型:‘auds’(音频流)、‘vids’(视频流)、//‘mids’(MIDI流)、‘txts’(文字流)FOURCC fccHandler; // 指定流的处理者,对于音视频来说就是解码器DWORD  dwFlags;    // 标记:是否允许这个流输出?调色板是否变化?WORD   wPriority;  // 流的优先级(当有多个相同类型的流时优先级最高的为默认流)WORD   wLanguage;DWORD  dwInitialFrames; // 为交互格式指定初始帧数DWORD  dwScale;   // 这个流使用的时间尺度DWORD  dwRate;DWORD  dwStart;   // 流的开始时间DWORD  dwLength;  // 流的长度(单位与dwScale和dwRate的定义有关)DWORD  dwSuggestedBufferSize; // 读取这个流数据建议使用的缓存大小DWORD  dwQuality;    // 流数据的质量指标(0 ~ 10,000)DWORD  dwSampleSize; // Sample的大小struct {undefinedshort int left;short int top;short int right;short int bottom;
}  rcFrame;  // 指定这个流(视频流或文字流)在视频主窗口中的显示位置// 视频主窗口由AVIMAINHEADER结构中的dwWidth和dwHeight决定
} AVISTREAMHEADER;

strf LIST

strf块用于说明流的具体格式,分为视频流,音频流。

strf块结构:

  • 视频流结构: BITMAPINFO数据结构

    typedef struct tagBITMAPINFO{BITMAPINFOHEADER bmiHeader;RGBQUAD bmiColors[1]; //颜色表
    }BITMAPINFO;typedef struct tagBITMAPINFOHEADER{   DWORD biSize; //本结构的长度,为40个字节。LONG biWidth;    //位图的宽度,以像素为单位。   LONG biHeight; //位图的高度,以像素为单位。   WORD biPlanes; //目标设备的级别,必须是1。   WORD biBitCount;   //每个像素所占的位数(bit),其值必须为1(黑白图像)、4(16色图)、8(256色)、24(真彩色图),新的BMP格式支持32位色。   DWORD biCompression;    //位图压缩类型,有效的值为BI_RGB(未经压缩)、BI_RLE8、BI_RLE4、BI_BITFILEDS(均为Windows定义常量)。   DWORD biSizeImage; //实际的位图数据占用的字节数   LONG biXPelsPerMeter; //指定目标设备的水平分辨率   LONG biYPelsPerMeter;  //指定目标设备的垂直分辨率   DWORD biClrUsed;   //位图实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次幂   DWORD biClrImportant;    //位图显示过程中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。
    } BITMAPINFOHEADER;
    
  • 音频流结构: WAVEFORMATEX数据结构

    typedef struct
    {undefinedWORD  wFormatTag; //设置波形声音的格式,更多的信息请参考说明部分。WORD  nChannels;    //设置音频文件的通道数量,对于单声道的声音,此此值为1。对于立体声,此值为2.DWORD  nSamplesPerSec; //设置每个声道播放和记录时的样本频率。DWORD  nAvgBytesPerSec; //设置请求的平均数据传输率,单位byte/s。这个值对于创建缓冲大小是很有用的。WORD  nBlockAlign;  //以字节为单位设置块对齐。块对齐是指最小数据的原子大小。WORD  wBitsPerSample;  //根据wFormatTag的类型设置每个样本的位深(即每次采样样本的大小,以bit为单位)。WORD  cbSize;   //额外信息的大小,以字节为单位,额外信息添加在WAVEFORMATEX结构的结尾。
    } WAVEFORMATEX; *PWAVEFORMATEX;
    

movi LIST

movi LIST保存的是真正的媒体流数据,其数据组织方式有两种。可以将数据块直接嵌在movi列表里面,也可以将几个数据块分组成一个rec 列表后再编排进movi

​ 数据块使用了一个四字符码来表征它的类型,这个四字符码由2个字节的类型码和2个字节的流编号组成。标准的类型码定义如下:db(非压缩视频帧)、dc(压缩视频帧)、pc(改用新的调色板)、wb(音缩视频)。比如第一个流(Stream 0)是音频,则表征音频数据块的四字符码为00wb;第二个流(Stream 1)是视频,则表征视频数据块的四字符码为00db00dc

第三周 AVI文件格式解析相关推荐

  1. AVI 文件格式解析

    AVI 文件格式解析 前言 AVI(Audio Video Interleaved 音频视频交错格式)是一种音视频的封装格式,于1992年由微软公司推出.它用RIFF(Resource Interch ...

  2. AVI文件格式解析+AVI文件解析工具

    (转)AVI文件格式解析+AVI文件解析工具 AVI文件解析工具下载地址:http://download.csdn.net/detail/zjq634359531/7556659 AVI(Audio ...

  3. 第三周 AVI、MP4、WAV文件格式

    一.AVI文件 打开一个AVI文件,其音频数据与视频数据是如何放置的? 一个视频帧大约占据多少字节? 一个音频数据块大约占据多少字节? 52 49 46 46 是RIFF的ASCII码值,说明这是一个 ...

  4. 手机视频文件格式解析之 3GP/MP4

    转载自百度文库 作者: k歌之王      2009-08-23 前言:做完了手机全能播放器的项目, 又要告别几个月来并肩作战,即将去北京发展的Manager zhu.准备把 做过的3GP/FLV/A ...

  5. WAV文件格式分析(附AVI文件格式分析)

    目录 一.WAV格式简介 二.WAV格式结构 1.RIFF chunk 2.Format chunk 3.Data chunk 三.AVI文件格式分析 Q1:音频和视频的数据是如何放置的?交织放置or ...

  6. AVI音视频封装格式学习(三)——AVI 数据结构解析

    这里介绍AVI会使用到的数据结构,为了避免翻译引入歧义,决定该部分还是使用英文原文,如后续有时间再进行翻译. AVIMAINHEADER structure The AVIMAINHEADER str ...

  7. Python语言程序设计(嵩天老师版)第三周代码解析——字符串部分

    目录 一.文本进度条 二.星号三角形 三.凯撒密码 一.文本进度条 题目: 采用字符串方式打印可以动态变化的文本进度条‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬,进度条需要能在一 ...

  8. 【数据压缩】WAV文件和AVI文件格式分析

    一.WAV文件和AVI文件格式简介 WAV的英文全称是Waveform Audio File Format ,它采用 RIFF (Resource Interchange File Format)文件 ...

  9. 3GP/MP4 视频文件格式解析及其播放原理(转)

    视频文件格式解析之 3GP/MP4 1. 概述 流行的文件格式背后都有大公司的支持.FLV得益于ADOBE公司推动的网络视频分享风潮,而AVI则是MICROSOFT首创的RIFF即视频和音频交 织在一 ...

最新文章

  1. linux redis数据库安装配置,Linux系统中redis的安装配置步骤
  2. JNI与底层调用-2
  3. SQL解析之硬解析和软解析
  4. [模板]多项式全家桶小记(求逆,开根,ln,exp)
  5. java中public private_java中public、private、protected区别
  6. linux两台服务器 同一个地址_【网工玩Linux】搭建开源多运营商(ISP)链路负载均衡器...
  7. c语言将两个文件合成一个,keil中怎么把两个c程序怎么同时同时编译生成一个hex文件...
  8. Centos6.5 源码安装MySql5.6.33
  9. PPPoE技术白皮书
  10. 点滴记录笔记_持续更新
  11. 小码哥C++_反汇编分析
  12. 计算机表示图形的几种方法。
  13. 【日常记录】win10打印机打印不出来,打印队列里有文档无法删除
  14. 了解DN、RDN和CN
  15. Debian 配置RTL8723BU连接wifi网络
  16. nexus在docker安装nexus与初始密码问题
  17. web前端学习笔记26-事件类型——一般事件、页面事件、表单事件
  18. Symbian S60v5 编程中的程序图标更换问题
  19. kernel卡死时自动重启
  20. 智能社vue.js项目实战(精讲)

热门文章

  1. 阿里业务平台技术质量部——测试开发面试
  2. MATLAB与SolidWorks联合仿真
  3. 在Nvida TX1上搭建ROS
  4. 中老年女装洞察报告:2900亿的中老年女装生意|60加研究院
  5. 自然语言处理 one-hot编码
  6. Trie Tree 介绍
  7. python:使用任意语言,递归地将某个磁盘目录下的 jpeg 文件的扩展名修改为 jpg【杭州多测师_王sir】【杭州多测师】...
  8. 中国这门失传已久的武林绝学,竟让研究它的老外拿了诺贝尔奖
  9. c# 获取machineguid_c# – 如何使用objectGUID获取DirectoryEntry?
  10. RS推荐系统-LSH最近邻查找+MiniHash