视频文件格式分析(1):avi格式

近日某网盘对用户保存其中的部分私人视频进行篡改,使得这部分视频无论是在线或者下载后均无法播放。我们借着研究对应方法,修复被非法篡改的视频数据,恢复正常使用的机会,研究一下avi的数据格式。

avi视频的格式分析

avi是“音视频交错(Audio-Video Interlance)"的缩写,是非常常见的视频文件封装格式。avi是一种适用于采集、编辑、播放的RIFF格式,对不同的编码标准和播放工具具有很强的适应性。

1、文件主体结构

RIFF文件的组成方式由多个chuck组成,组成方式为:

  1. FOURCC字符:表示当前chuck的名称;
  2. chuck大小:一个uint32类型整数,使用little-endian保存;该值仅表示下一部分“文件内容”的字节数大小;
  3. chuck数据:表示当前chuck中实际包含的信息内容;

每一个文件有且仅有一个RIFF chuck,它可以包含多个子chuck,其中的list可以再包含下一级子chuck。相比普通chuck,在RIFF和LIST的chuck大小和数据之间多了一个表示“Form
Type/List Type”4个FOURCC字符,如“AVI[ ]”或“WAVE”等,即组成为:

  1. FOURCC字符:表示当前chuck的名称,对于最上层的chuck,固定为“RIFF”;
  2. chuck大小:一个uint32类型整数,使用little-endian保存;该值仅表示下一部分“文件内容”的字节数大小,不包含riff字符和文件大小本身;
  3. 4字节的形式类型或者列表类型:在此为“AVI[ ]”;
  4. chuck数据:表示当前chuck中实际包含的信息内容;

下一部分数据是AVI的LIST子块。AVI数据块一般包含3个LIST,分别是hdrl、movi和idxl三个,分别表示头信息、音视频数据和索引信息。

每一个list的结构如下:

  1. FOURCC字符:“LIST”
  2. LIST数据块的大小;
  3. LIST类型;
  4. LIST数据;

首先研究第一个LIST,即hdrl list。首先包括了一个数据结构表示当前数据的AVI Main Header结构,用AVIMAINHEADER表示。这个数据结构包含了当前AVI文件的整体信息,包括视频分辨率、视频中的流数目等。AVIMAINHEADER实现方式如下:

typedef struct _avimainheader {
    FOURCC fcc;<span style="white-space:pre">			</span>//fourcc字符“avih”
    DWORD  cb;<span style="white-space:pre">			</span>//当前结构占据多少个字节
    DWORD  dwMicroSecPerFrame;<span style="white-space:pre">	</span>//显示相邻两帧的间隔,以毫秒为单位
    DWORD  dwMaxBytesPerSec;<span style="white-space:pre">	</span>//每秒钟传输的最大数据量的估计值
    DWORD  dwPaddingGranularity;//字节对齐单位,数据块长度必须是该值的倍数
    DWORD  dwFlags;<span style="white-space:pre">		</span>//一些标志位
    DWORD  dwTotalFrames;<span style="white-space:pre">	</span>//数据帧的总数
    DWORD  dwInitialFrames;<span style="white-space:pre">	</span>//第一个视频帧开始播放之前需预先准备的帧数
    DWORD  dwStreams;<span style="white-space:pre">		</span>//文件中流的个数(如一个视频流+一个音频流=2个流)
    DWORD  dwSuggestedBufferSize;//读取数据的缓存区的建议大小
    DWORD  dwWidth;<span style="white-space:pre">		</span>//视频像素宽度
    DWORD  dwHeight;<span style="white-space:pre">		</span>//视频像素高度
    DWORD  dwReserved[4];<span style="white-space:pre">	</span>//保留位
} AVIMAINHEADER;

在AVIMAINHEADER之后是hdrl的子list——strl,包括strh和strf,分别表示stream header和stream format信息。另外,还可能包括strd和strn等部分分别表示header data和stream name等数据。

以下为strh包含的 AVISTREAMHEADER结构:

typedef struct _avistreamheader {
     FOURCC fcc;//“strh”四字符
     DWORD  cb;//当前结构大小
     FOURCC fccType;//表示当前stream所包含的数据类型
     FOURCC fccHandler;//对于音频、视频数据,该部分表示所采用的解码器
     DWORD  dwFlags;
     WORD   wPriority;//表示当前流的优先级
     WORD   wLanguage;//语言
     DWORD  dwInitialFrames;
     DWORD  dwScale;//与下一个元素一起表示sample的频率,如视频帧率等。
     DWORD  dwRate;
     DWORD  dwStart;//表示当前流的起始时间
     DWORD  dwLength;//该stream的长度
     DWORD  dwSuggestedBufferSize;//建议缓存区大小
     DWORD  dwQuality;//表示数据质量;在视频流中表示编码的QP
     DWORD  dwSampleSize;//sample的大小
     struct {
         short int left;
         short int top;
         short int right;
         short int bottom;
     }  rcFrame;//数据显示的目标区域
} AVISTREAMHEADER;

紧跟着strh之后是一个strf数据块,该数据块表示当前流中的数据格式。对于视频,以BITMAPINFO表示;对于音频,以WAVEFORMATEX表示。数据结构如下:

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;
typedef struct tagRGBQUAD {
  BYTE rgbBlue;
  BYTE rgbGreen;
  BYTE rgbRed;
  BYTE rgbReserved;
} RGBQUAD;

在实验中,BITMAPINFOHEADER中的biCompression成员为一个fourCC字符“avc1”,且不包含后面的RGBQUAD部分。

对于音频部分,WAVEFORMATEX的实现如下:

typedef struct {
  WORD  wFormatTag;
  WORD  nChannels;
  DWORD nSamplesPerSec;
  DWORD nAvgBytesPerSec;
  WORD  nBlockAlign;
  WORD  wBitsPerSample;
  WORD  cbSize;
} WAVEFORMATEX; 

这部分的后面还存在一个odml的list,包含一个dmlh的部分,用来表示avi扩展头部序列块。

以上部分即avi文件的文件信息hdrl部分,紧接着便是保存实际音视频数据的movi list。一个fourcc字符“movi”之后的fourcc字符可能含有一下双字符组合中的一个,表示chuck中包含的数据的种类:

字符组合 含义
db 未压缩视频帧
dc 压缩的视频数据
pc 调色信息
wd 音频信息

在文件的最后,包含一个可选的chuck——索引数据“idx1”。索引chuck包含了各个数据chuck在文件中的位置,其实现方式如下:

typedef struct _avioldindex {
   FOURCC  fcc;
   DWORD   cb;
   struct _avioldindex_entry {
      DWORD   dwChunkId;
      DWORD   dwFlags;
      DWORD   dwOffset;
      DWORD   dwSize;
  } aIndex[];
} AVIOLDINDEX;

由此可以看出,avi格式在文件末尾包含了索引信息,所以播放需要获得从开始到结束的完整文件数据。由于这种特性,avi格式并不适合应用在流视频传输和播放的场合。

时间: 2024-10-06 05:50:48

视频文件格式分析(1):avi格式的相关文章

图像处理-求:AVI格式视频转换为MP4格式视频方法

问题描述 求:AVI格式视频转换为MP4格式视频方法 我现在在做一个课题,需要把AVI格式视频在VS2010开发环境下利用C++语言转换为MP4格式的视频.不使用其他第三视频转码软件,如何利用C++实现. 各种大神求详细教程,或者留下联系方式我们详谈 解决方案 http://download.csdn.net/download/u010993875/5817901http://blog.sina.com.cn/s/blog_51396f890102dyh5.html 解决方案二: 利用 FFMP

视频-请大佬支招:用matlab读取AVI格式文件总是不成功?

问题描述 请大佬支招:用matlab读取AVI格式文件总是不成功? 视频格式为: Filename: 'C:UsersAdministratorDesktop视频yanwu-new-new.avi' ** FileSize: 486638592 FileModDate: '25-十二月-2015 00:52:49' NumFrames: 22 FramesPerSecond: 30.3030 Width: 5120 Height: 2880 ImageType: 'truecolor' Vide

ASP中将视频文件转换成.flv格式

  现在出现很的网上在线视频其文件格式都是.FLV格式,那些视频网站大概也有一个视频转换软件,所我在也试着去做了一个demo拿出来和大家共享一下,由于自己的技术有限,做的不怎么样,愿有高人看完给 在下指点一二.呵.... 费话不多说了,下面来分解一下这个Demo. 首先,我们部署一下文件夹.在工程的目录下新建几个文件夹如下图: 中将视频文件转换成.flv格式UpFiles文件夹是要保存你上传的文件,PlayFiles文件夹是用于你转换后保存的文件(用于网上播放) ImgFile文件夹是保存截取视

h264是什么视频文件格式?

h264是什么视频文件格式? H.264 是MPEG-4 标准所定义的最新格式,同时也是技术含量最高.代表最新技术水平的视频编码格式之一,有的也称AVC(高级视频编码),是一种视频压缩标准.是一种被广泛使用的高精度视频的录制.压缩和发布格式. H.264的硬件应用- HD-DVD/蓝光(Blu-ray) DVD论坛(DVD Forum)和蓝光光盘协会(Blu-ray Disc Association)正在讨论能支持高清晰(High Definition)内容(存储容量完全超过当前的DVD)下一代

avi格式的电影是不是高清的

  问题描述:我是一个电影爱好者,平时一直喜欢用电脑的看电影,不经意的发现电影存在很多格式,我现在想知道AVI格式的电影属于高清电影吗? 问题回答:通过分辨率来判断电影是否高清,目前有两种:一种是1920*1080,另一种是1280*720.而现在主流的DV机(指的非高清DV)拍的视频为720*576,这种DV机属于标清像素,DVD采用的640*480及VCD采用的320*240这些一般的信号. AVI格式的视频相对于其它格式的视频,是一种无损的编码方式,相对而言是最清晰的.但AVI格式的视频分

视频文件格式

本人最近在做一个android视频的项目.特意总结了常见的视频格式: m,rmvb,mpeg1-4 mov mtv dat wmv avi 3gp amv dmv    这类格式可是影像阵营中的一个大家族,也是我们平时所见到的最普遍的一种视频格式.从它衍生出来的格式尤其多,包括以mpg.mpe.mpa.m15.m1v.mp2等等为后缀名的视频文件都是出自这一家族.MPEG格式包括MPEG视频.MPEG音频和MPEG系统(视频.音频同步)三个部分,MP3(MPEG-3)音频文件就是MPEG音频的一

DEX文件格式分析

前段时间忙于破解移动和电信的 apk ,挺久没有更新博客了,最近在写个工具,主要功能是通过配置对 dex 文件中的类型.函数.属性进行隐藏,达到防止被静态分析的效果.所以在写工具前必须对 dex 的文件格式有个清晰的认识,相对于 elf 文件格式 dex 文件格式会简单一些. 原文链接: DEX文件格式分析 0x00 前言 分析 dex 文件格式最好的方式是找个介绍文档,自己再写一个简单的 demo 然后用 010Editor 对照着分析.文档可以参考官方文档http://source.andr

ART世界探险(11) - OAT文件格式分析(1) - ELF文件头(上)

ART世界探险(11) - OAT文件格式分析(1) - ELF文件头(上) 既然是要探险,咱们就保持一定的深度,起码将来可以做个基于ART的黑客之类的. 所以我们针对细节多下一些工夫,先仔细分析一下OAT文件的格式. ART的本质上是一个编译器,所以我们需要对编译.链接的主要环节都有一个比较深入的了解.想要绕过编译原理去学好ART,是不太现实的一件事情,我们选择可以让这个过程有趣和好玩. 闲扯不多说了,言归正传. 可执行文件 OAT是一种可执行文件,所以封装在一个ELF格式的可执行文件中. 可

wav文件格式分析详解

wav文件格式分析详解 文章转载自:http://blog.csdn.net/BlueSoal/article/details/932395 一.综述    WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的.RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是"RIFF".    WAVE文件是由若干个Chunk组成的.按照在文件中的出现位置包括:RIFF WAVEChunk, Format C