avi视频协议的理解

可以把avi文件理解为由无数个struct结构组成的:

  1. struct avifile { 'RIFF', 'AVI', struct. movi, struct hdrl}

  2. struct hdrl { 'LIST', 'hdal', struct avih, struct stream0,struct stream1,struct stream2};

  3. struct stream {'LIST' , 'STRL', struct strh, struct strf }

  4. struct movi { 'LIST' , 'movi'}

  5. n* struct data { '00db' ,data} 循环写入帧数据

在avi文件中都是按照这个镶嵌顺序顺序写入的。

  1. avifile:

struct avifile

{

unsigned char id[4];

unsigned int size;

unsigned char type[4];

struct. movi;

struct hdrl avi_hdrl;

}

  1. struct hdrl

typedef struct hdrl

{

unsigned char id[4]; //块ID,固定为LIST

unsigned int size; //块大小,等于struct avi_hdrl_list去掉id和size的大小

unsigned char type[4]; //块类型,固定为hdrl

struct avih;

struct stream;

}

  1. struct avih

struct avih

{

unsigned char id[4]; //块ID,固定为avih

unsigned int size; //块大小,等于struct avi_avih_chunk去掉id和size的大小

unsigned int us_per_frame; //视频帧间隔时间(以微秒为单位)

unsigned int max_bytes_per_sec; //AVI文件的最大数据率

unsigned int padding; //设为0即可

unsigned int flags; //AVI文件全局属性,如是否含有索引块、音视频数据是否交叉存储等

unsigned int total_frames; //总帧数

unsigned int init_frames; //为交互格式指定初始帧数(非交互格式应该指定为0)

unsigned int streams; //文件包含的流的个数,仅有视频流时为1

unsigned int suggest_buff_size; //指定读取本文件建议使用的缓冲区大小,通常为存储一桢图像 //以及同步声音所需的数据之和,不指定时设为0

unsigned int width; //视频主窗口宽度(单位:像素)

unsigned int height; //视频主窗口高度(单位:像素)

unsigned int reserved[4]; //保留段,设为0即可

}

4 . 含两个struct strh,struct strf

struct stream {

struct strh

{

unsigned char id[4]; //块ID,固定为strh

unsigned int size; //块大小,等于struct avi_strh_chunk去掉id和size的大小

unsigned char stream_type[4]; //流的类型,vids表示视频流,auds表示音频流

unsigned char codec[4]; //指定处理这个流需要的解码器,如JPEG

unsigned int flags; //标记,如是否允许这个流输出、调色板是否变化等,一般设为0即可

unsigned short priority; //流的优先级,视频流设为0即可

unsigned short language; //音频语言代号,视频流设为0即可

unsigned int init_frames; //为交互格式指定初始帧数(非交互格式应该指定为0)

unsigned int scale; //

unsigned int rate; //对于视频流,rate / scale = 帧率fps

unsigned int start; //对于视频流,设为0即可

unsigned int length; //对于视频流,length即总帧数

unsigned int suggest_buff_size; //读取这个流数据建议使用的缓冲区大小

unsigned int quality; //流数据的质量指标

unsigned int sample_size; //音频采样大小,视频流设为0即可

AVI_RECT_FRAME rcFrame; //这个流在视频主窗口中的显示位置,设为{0,0,width,height}即可

},

struct strf

{

unsigned char id[4]; //块ID,固定为strf

unsigned int size; //块大小,等于struct avi_strf_chunk去掉id和size的大小

unsigned int size1; //size1含义和值同size一样

unsigned int width; //视频主窗口宽度(单位:像素)

unsigned int height; //视频主窗口高度(单位:像素)

unsigned short planes; //始终为1

unsigned short bitcount; //每个像素占的位数,只能是1、4、8、16、24和32中的一个

unsigned char compression[4]; //视频流编码格式,如JPEG、MJPG等

unsigned int image_size; //视频图像大小,等于width * height * bitcount / 8

unsigned int x_pixels_per_meter; //显示设备的水平分辨率,设为0即可

unsigned int y_pixels_per_meter; //显示设备的垂直分辨率,设为0即可

unsigned int num_colors; //含义不清楚,设为0即可

unsigned int imp_colors; //含义不清楚,设为0即可

}

}

typedef struct avi_rect_frame

{

short left;

short top;

short right;

short bottom;

}AVI_RECT_FRAME;

上面的4个结构体都是镶嵌的,在文件中都是顺序写入的,甚至可以把这几个组织称一个 struct

  1. struct movi

struct movi

{

unsigned char id[4]; //块ID,固定为LIST

unsigned int size;

unsigned char type[4]; //固定为MOVI

}

  1. 写data

struct data {

unsigned char id[4]; // 00dc 表示第一个流为视频压缩数据

unsigned int len; // 每帧数据大小

void *data ; //数据

}

最后写数据可以理解为是struct,但不用结构处理,而是直接先写4字节的00dc, 再写文件长度,最后直接写入帧数据,这样就完成一帧图片的写入,前面的几个结构需要全部要写入的总帧数和总字节数,都是在最后写入数据完成后再回写回去的。

相关推荐
程序视点6 小时前
Window 10文件拷贝总是卡很久?快来试试这款小工具,榨干硬盘速度!
windows
wuk9987 小时前
基于MATLAB编制的锂离子电池伪二维模型
linux·windows·github
lzb_kkk8 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
站在巨人肩膀上的码农12 小时前
全志T507 音频ALSA核心层注册流程分析
驱动开发·音视频·安卓·全志·alsa·声卡
Paper_Love15 小时前
x86-64_windows交叉编译arm_linux程序
arm开发·windows
前端若水16 小时前
通过 Windows 共享文件夹 + 手机访问(SMB协议)如何实现
windows·智能手机
】余185381628001 天前
碰一碰发视频源码搭建与定制化开发:支持OEM
音视频
张晓~183399481211 天前
数字人分身+矩阵系统聚合+碰一碰发视频: 源码搭建-支持OEM
线性代数·矩阵·音视频
山登绝顶我为峰 3(^v^)31 天前
如何录制带备注的演示文稿(LaTex Beamer + Pympress)
c++·线性代数·算法·计算机·密码学·音视频·latex
超龄超能程序猿1 天前
dnSpy 使用教程
windows·microsoft