1 #ifndef _AVI_DEFINE_H_ 2 #define _AVI_DEFINE_H_ 3 4 #include "stdint.h" 5 6 /** 7 * reference links: https://www.cnblogs.com/songhe364826110/p/7619949.html 8 * AVIFileFormat: https://web.archive.org/web/20170411001412/http://www.alexander-noe.com/video/documentation/avi.pdf 9 * OpenDML AVI File Format Extensions: https://web.archive.org/web/20070112225112/http://www.the-labs.com/Video/odmlff2-avidef.pdf 10 */ 11 typedef struct 12 { 13 uint32_t FourCC; 14 uint32_t size; //块大小,等于之后数据的大小 15 /* 数据 uint8_t _data[size]; */ 16 } AVI_CHUNK_HEAD; 17 18 typedef struct 19 { 20 uint32_t List; //固定为"LIST",如果是 RIFF List 则为 "RIFF" 21 uint32_t size; //块大小,等于之后数据的大小 22 uint32_t FourCC; 23 /* 数据 uint8_t _data[size-4]; */ 24 } AVI_LIST_HEAD; 25 26 typedef struct 27 { 28 uint32_t FourCC; //块ID,固定为avih 29 uint32_t size; //块大小,等于struct avi_avih_chunk去掉id和size的大小 30 uint32_t us_per_frame; //视频帧间隔时间(以微秒为单位) 31 uint32_t max_bytes_per_sec; //AVI文件的最大数据率 32 uint32_t padding; //设为0即可 33 uint32_t flags; //AVI文件全局属性,如是否含有索引块、音视频数据是否交叉存储等 34 uint32_t total_frames; //总帧数 35 uint32_t init_frames; //为交互格式指定初始帧数(非交互格式应该指定为0) 36 uint32_t streams; //文件包含的流的个数,仅有视频流时为1 37 uint32_t suggest_buff_size; //指定读取本文件建议使用的缓冲区大小,通常为存储一桢图像以及同步声音所需的数据之和,不指定时设为0 38 uint32_t width; //视频主窗口宽度(单位:像素) 39 uint32_t height; //视频主窗口高度(单位:像素) 40 uint32_t reserved[4]; //保留值dwScale,dwRate,dwStart,dwLength 41 } AVI_AVIH_CHUNK; 42 43 typedef struct 44 { 45 int16_t left; 46 int16_t top; 47 int16_t right; 48 int16_t bottom; 49 } AVI_RECT_FRAME; 50 51 typedef struct 52 { 53 uint32_t FourCC; //块ID,固定为strh 54 uint32_t size; //块大小,等于struct avi_strh_chunk去掉id和size的大小 55 uint32_t fourcc_type; //流的类型,vids表示视频流,auds表示音频流 56 uint32_t fourcc_codec; //指定处理这个流需要的解码器,如JPEG 57 uint32_t flags; //标记,如是否允许这个流输出、调色板是否变化等,一般设为0即可 58 uint16_t priority; //流的优先级,视频流设为0即可 59 uint16_t language; //音频语言代号,视频流设为0即可 60 uint32_t init_frames; //为交互格式指定初始帧数(非交互格式应该指定为0) 61 uint32_t scale; // 62 uint32_t rate; //对于视频流,rate / scale = 帧率fps 63 uint32_t start; //对于视频流,设为0即可 64 uint32_t length; //对于视频流,length即总帧数 65 uint32_t suggest_buff_size; //读取这个流数据建议使用的缓冲区大小 66 uint32_t quality; //流数据的质量指标 67 uint32_t sample_size; //音频采样大小,视频流设为0即可 68 AVI_RECT_FRAME rcFrame; //这个流在视频主窗口中的显示位置,设为{0,0,width,height}即可 69 } AVI_STRH_CHUNK; 70 71 /*对于视频流,strf块结构如下*/ 72 typedef struct 73 { 74 uint32_t FourCC; //块ID,固定为strf 75 uint32_t size; //块大小,等于struct avi_strf_chunk去掉id和size的大小 76 uint32_t size1; //size1含义和值同size一样 77 uint32_t width; //视频主窗口宽度(单位:像素) 78 uint32_t height; //视频主窗口高度(单位:像素) 79 uint16_t planes; //始终为1 80 uint16_t bitcount; //每个像素占的位数,只能是1、4、8、16、24和32中的一个 81 uint32_t fourcc_compression; //视频流编码格式,如"JPEG"、"MJPG"等 82 uint32_t image_size; //视频图像大小,等于width * height * bitcount / 8 83 uint32_t x_pixels_per_meter; //显示设备的水平分辨率,设为0即可 84 uint32_t y_pixels_per_meter; //显示设备的垂直分辨率,设为0即可 85 uint32_t num_colors; //含义不清楚,设为0即可 86 uint32_t imp_colors; //含义不清楚,设为0即可 87 } AVI_VIDS_STRF_CHUNK; 88 89 /*对于音频流,strf块结构如下*/ 90 typedef struct __attribute__((packed)) 91 { 92 uint32_t FourCC; //块ID,固定为strf 93 uint32_t size; //块大小,等于struct avi_strf_chunk去掉id和size的大小 94 uint16_t format_tag; 95 uint16_t channels; 96 uint32_t samples_per_sec; 97 uint32_t avg_bytes_per_sec; 98 uint16_t block_align; 99 uint32_t bits_per_sample; 100 } 101 AVI_AUDS_STRF_CHUNK; 102 103 typedef struct 104 { 105 AVI_LIST_HEAD strl; 106 AVI_STRH_CHUNK strh; 107 AVI_VIDS_STRF_CHUNK strf; 108 } AVI_STRL_LIST; 109 110 typedef struct 111 { 112 AVI_LIST_HEAD hdrl; 113 AVI_AVIH_CHUNK avih; 114 AVI_STRL_LIST strl; 115 } AVI_HDRL_LIST; 116 117 typedef struct 118 { 119 uint32_t FourCC; //块ID,固定为 "idx1" 120 uint32_t flags; 121 uint32_t chunkoffset; 122 uint32_t chunklength; 123 } AVI_IDX1; 124 125 /** 126 "db":未压缩的视频帧(RGB数据流); 127 "dc":压缩的视频帧; 128 "wb":音频未压缩数据(Wave数据流); 129 "wc":音频压缩数据(压缩的Wave数据流); 130 "pc":改用新的调色板。(新的调色板使用一个数据结构AVIPALCHANGE来定义。如果一个流的调色板中途可能改变,则应在这个流格式的描述中,也就是AVISTREAMHEADER结构的dwFlags中包含一个AVISF_VIDEO_PALCHANGES标记。) 131 */ 132 133 #endif 134