AVI封装
来源:互联网 发布:贴片机工作原理及编程 编辑:程序博客网 时间:2024/06/06 01:53
http://blog.chinaunix.net/uid-27091949-id-4088330.html
The Microsoft AVI file format is a RIFF file specification used with applications that capture, edit, and play back audio-video sequences. In general, AVI files contain multiple streams of different types of data. Most AVI sequences use both audio and video streams. A simple variation for an AVI sequence uses video data and does not require an audio stream.
以下是具体封装:
"RIFF" //
0X00 //文件总长度,可设置为0
"AVI " //最后有个空格
"LIST" //list0
0X00 //list0 length,不可以置0
"hdrl" //
"avih" //fcc
0X38 //cb 长度,56字节
0Xa2c2 //dwMicroSecPerFrame 每帧微秒值,这个值可以通过 10^6 / fps求得
0X00 //dwMaxBytesPerSec (可设置为0)
0X00 //dwPaddingGranularity (可设置为0)
0X0910 //dwFlags (AVIF_HASINDEX | AVIF_ISINTERLEAVED | AVIF_TRUSTCKTYPE)
0X00 //dwTotalFrames 可设置为0
0X00 //dwInitialFrames 可设置为0
0X02 //dwStreams 流的个数,如果是一个视频流一个音频流,此处就是2,
0X100000//dwSuggestedBufferSize 1024 * 1024
0X00 //dwWidth 视频宽,不可设置为0
0X00 //dwHeight 视频高, 不可设置为0
0X00 //dwReserved[0] 设置为0
0X00 //dwReserved[1] 设置为0
0X00 //dwReserved[2] 设置为0
0X00 //dwReserved[3] 设置为0
///////////////////////////////////////////////////////////////////////////////////////////////
typedef struct _avimainheader {
FOURCC fcc;
DWORD cb;
DWORD dwMicroSecPerFrame;
DWORD dwMaxBytesPerSec;
DWORD dwPaddingGranularity;
DWORD dwFlags;
DWORD dwTotalFrames;
DWORD dwInitialFrames;
DWORD dwStreams;
DWORD dwSuggestedBufferSize;
DWORD dwWidth;
DWORD dwHeight;
DWORD dwReserved[4];
} AVIMAINHEADER;
///////////////////////////////////////////////////////////////////////////////////////////////
"LIST" //list1
0X00 //list1 length 不可设置为0
"strl"
"strh" //fcc
0X38 //cb 流头部长度
"vids" //fccType
0X00 //fccHandler 此处可设置为0
0X00 //dwFlags 此处可设置为0
0X00 //wPriority AND wLanguage 可设置为0
0X00 //dwInitialFrames 可设置为0
0X01 //dwScale
0X19 //dwRate (dwRate / dwScale = fps)
0X00 //dwStart 可设置为0
0X00 //dwLength 可设置为0
0X100000//dwSuggestedBufferSize 1024 * 1024
0XFFFFFFFF//dwQuality
0X00 //dwSampleSize 可设置为0
0X00 //left AND top 设置为0
0X00 //Height << 16 | Width 不可设置为0
/////////////////////////////////////////////////////////////////////////////////////////////
typedef struct _avistreamheader {
FOURCC fcc;
DWORD cb;
FOURCC fccType;
FOURCC fccHandler;
DWORD dwFlags;
WORD wPriority;
WORD wLanguage;
DWORD dwInitialFrames;
DWORD dwScale;
DWORD dwRate;
DWORD dwStart;
DWORD dwLength;
DWORD dwSuggestedBufferSize;
DWORD dwQuality;
DWORD dwSampleSize;
struct {
short int left;
short int top;
short int right;
short int bottom;
} rcFrame;
} AVISTREAMHEADER;
/////////////////////////////////////////////////////////////////////////////////////////////
"strf"
0X28 //
0X28 //biSize
0X00 //biWidth 不可设置为0
0X00 //biHeight 不可设置为0
0X180001//biBitCount << 16 | biPlanes (biBitCount表示一个像素用几位表示,此处24位,biPlanes设备位面,为1)
"H264" //biCompression For compressed video and YUV formats, this member is a FOURCC code, specified as a //DWORD in little-endian order.For example, YUYV video has the FOURCC 'VYUY' or 0x56595559. //For more information see FOURCC Codes.
0X00 //biSizeImage = biWidth * biHeight * biBitCount / 8 不可设置为0
0X00 //biXPelsPerMeter 可设置为0
0X00 //biYPelsPerMeter 可设置为0
0X00 //biClrUsed 可设置为0
0X00 //biClrImportant 可设置为0
//list1长度计算到这里
///////////////////////////////////////////////////////////////////////////////////////////////
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;
////////////////////////////////////////////////////////////////////////////////////////////////
"LIST" //list2
0x00 //list2 length 不可设置为0
"strl"
"strh" //fcc
0X38 //cb 流头部长度
"auds" //fccType
0X00 //fccHandler 此处可设置为0
0X00 //dwFlags 此处可设置为0
0X00 //wPriority AND wLanguage 可设置为0
0X00 //dwInitialFrames 可设置为0
0X01 //dwScale
0X00 //dwRate (dwRate / dwScale = audio bps/8)
0X00 //dwStart 可设置为0
0X00 //dwLength 可设置为0
0X3000 //dwSuggestedBufferSize 1024 * 12
0XFFFFFFFF //dwQuality
0X01 //dwSampleSize 可设置为0
0X00 //left AND top 设置为0
0X00 //right AND bottom 设置为0
////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct _avistreamheader {
FOURCC fcc;
DWORD cb;
FOURCC fccType;
FOURCC fccHandler;
DWORD dwFlags;
WORD wPriority;
WORD wLanguage;
DWORD dwInitialFrames;
DWORD dwScale;
DWORD dwRate;
DWORD dwStart;
DWORD dwLength;
DWORD dwSuggestedBufferSize;
DWORD dwQuality;
DWORD dwSampleSize;
struct {
short int left;
short int top;
short int right;
short int bottom;
} rcFrame;
} AVISTREAMHEADER;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
"strf" //
0X12 //sizeof(WAVEFORMATEX)
0X10007 //nChannels << 16 | wFormatTag
//nChannels : Number of channels in the waveform-audio data.
//Monaural data uses one channel and stereo data uses two channels.
//wFormatTag : 0X07:AV_CODEC_ID_PCM_MULAW 0X55:AV_CODEC_ID_MP3
0X00 //nSamplesPerSec 采样率,不可设置为0
0X00 //nAvgBytesPerSec 字节率,即bps/8 不可设置为0
0X80001 //wBitsPerSample << 16 | nBlockAlign
//wBitsPerSample:Bits per sample for the wFormatTag format type.
//If wFormatTag is WAVE_FORMAT_PCM,
//then wBitsPerSample should be equal to 8 or 16.
//nBlockAlign:Block alignment, in bytes.
//The block alignment is the minimum atomic unit of data for the
//wFormatTag format type. If wFormatTag is WAVE_FORMAT_PCM,
//nBlockAlign must equal (nChannels × wBitsPerSample) / 8.
0X00 //cbSize 设置为0,注意,这个字段只有16位
//list2长度计算到这里
///////////////////////////////////////////////////////////////////////////////////////////
typedef struct {
WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
} WAVEFORMATEX;
///////////////////////////////////////////////////////////////////////////////////////////
"JUNK"
0X00 //JUNK length 长度计算方式为使下一个LIST开始于16的倍数的地址
0X00... //length长度个字节,垃圾信息
//list0 长度计算到这里,avi头部到此结束
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
"LIST"
0X00 //list3 length 如果忽略这个长度,即置0,Movie Player,VLC等可以播放,Media Player不能播放
"movi"
"00dc" Length1 Video_Data (if Length % 2 == 1, we should add a byte 0x00 to the end of data for align)
"00wb" Length2 Audio_Data (if Length % 2 == 1, we should add a byte 0x00 to the end of data for align)
"00wb" Length3 Audio_Data
"00dc" Length4 Video_Data
. . .
. . .
. . .
"00dc" Lengthn Video_Data
//list3长度计算到这里,avi数据信息到此结束
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
"idx1"
0X00 //index length 不可设置为0
"00dc" 0X10000000 0X04 Length1
"00wb" 0X10000000 0Xxx Length2
"00wb" 0X10000000 0Xxx Length3
"00dc" 0X00000000 0Xxx Length4
第一字段 指定音视频
第二字段 关键帧 音频都置0X10000000,视频I帧置0X10000000,其他帧置0X00000000
第三字段 指定从"movi"开始的偏移 第一个指向"00dc" Length Video_Data (if Length % 2 == 1, we should add a byte 0x00 to the end of data for align)
第二个指向"00wb" Length Audio_Data (if Length % 2 == 1, we should add a byte 0x00 to the end of data for align)
第三个指向"00wb" Length Audio_Data
第四个指向"00dc" Length Video_Data
第四字段 数据长度,不包含对齐的那个字节
00000000 52 49 46 46 00 00 00 00 41 56 49 20 4C 49 53 54 RIFF....AVI LIST
00000010 3C 01 00 00 68 64 72 6C 61 76 69 68 38 00 00 00 <...hdrlavih8...
00000020 00 00 00 00 00 00 00 00 00 00 00 00 10 09 00 00 ................
00000030 00 00 00 00 00 00 00 00 02 00 00 00 00 00 10 00 ................
00000040 80 07 00 00 38 04 00 00 00 00 00 00 00 00 00 00 ....8...........
00000050 00 00 00 00 00 00 00 00 4C 49 53 54 74 00 00 00 ........LISTt...
00000060 73 74 72 6C 73 74 72 68 38 00 00 00 76 69 64 73 strlstrh8...vids
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000080 01 00 00 00 19 00 00 00 00 00 00 00 00 00 00 00 ................
00000090 00 00 10 00 FF FF FF FF 00 00 00 00 00 00 00 00 ................
000000A0 80 07 38 04 73 74 72 66 28 00 00 00 28 00 00 00 ..8.strf(...(...
000000B0 80 07 00 00 38 04 00 00 01 00 18 00 48 32 36 34 ....8.......H264
000000C0 00 EC 5E 00 00 00 00 00 00 00 00 00 00 00 00 00 ..^.............
000000D0 00 00 00 00 4C 49 53 54 5E 00 00 00 73 74 72 6C ....LIST^...strl
000000E0 73 74 72 68 38 00 00 00 61 75 64 73 00 00 00 00 strh8...auds....
000000F0 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 ................
00000100 40 1F 00 00 00 00 00 00 00 00 00 00 00 30 00 00 @............0..
00000110 FF FF FF FF 01 00 00 00 00 00 00 00 00 00 00 00 ................
00000120 73 74 72 66 12 00 00 00 07 00 01 00 40 1F 00 00 strf........@...
00000130 40 1F 00 00 01 00 08 00 00 00 4A 55 4E 4B 0E 00 @.........JUNK..
00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000150 4C 49 53 54 CA 91 5B 09 6D 6F 76 69 30 30 64 63 LIST..[.movi00dc
00000160 D2 67 02 00 00 00 00 01 67 64 00 28 AD 84 05 45 .g......gd.(...E
......................................
095B9310 0D 52 D0 DB 2B 82 73 01 6E B1 5B E5 D7 0B 1A AC .R..+.s.n.[.....
095B9320 67 10 69 64 78 31 30 B3 00 00 30 30 64 63 10 00 g.idx10...00dc..
095B9330 00 00 04 00 00 00 D2 67 02 00 30 30 64 63 10 00 .......g..00dc..
095B9340 00 00 DE 67 02 00 62 03 00 00 30 30 64 63 00 00 ...g..b...00dc..
095B9350 00 00 48 6B 02 00 B1 DF 00 00 30 30 64 63 00 00 ..Hk......00dc..
095B9360 00 00 02 4B 03 00 84 D8 00 00 30 30 64 63 00 00 ...K......00dc..
095B9370 00 00 8E 23 04 00 C5 9A 01 00 30 30 64 63 00 00 ...#......00dc..
095B9380 00 00 5C BE 05 00 2C AA 01 00 30 30 64 63 00 00 ..\...,...00dc..
095B9390 00 00 90 68 07 00 AE 7C 01 00 30 30 64 63 00 00 ...h...|..00dc..
095B93A0 00 00 46 E5 08 00 F3 78 01 00 30 30 64 63 00 00 ..F....x..00dc..
095B93B0 00 00 42 5E 0A 00 C7 18 01 00 30 30 64 63 00 00 ..B^......00dc..
095B93C0 00 00 12 77 0B 00 10 2A 01 00 30 30 64 63 00 00 ...w...*..00dc..
095B93D0 00 00 2A A1 0C 00 62 03 00 00 30 30 64 63 00 00 ..*...b...00dc..
参考文档:http://msdn.microsoft.com/en-us/library/windows/desktop/dd318189(v=vs.85).aspx
参考文档:http://www.alexander-noe.com/video/documentation/avi.pdf
0 0
- AVI封装
- AVI媒体封装格式
- 26.avi 分页逻辑的封装处理
- AVI文件中封装G711音频
- H264 数据avi文件封装和拆解
- AVILib Android AVI录像文件封装
- H264 数据avi文件封装和拆解
- linux MJPG编码和AVI封装
- H264 数据avi文件封装和拆解
- 音视频封装:AVI 格式分析
- avi
- AVI
- 视频编码中封装格式RMVB,AVI,264
- 05 ffmpeg桌面图像h264编码并封装avi
- 视频编码 MPEG2 MPEG4 DIVX Xvid H264 VC1封装格式MKV AVI RMVB MPG TS扫盲
- 基于ZedBoard的Webcam设计(四):MJPG编码和AVI封装
- 基于ZedBoard的Webcam设计(四):MJPG编码和AVI封装
- FFmpeg 开发记录---H264编码,avi封装,暴风影音,qq影音播放有声无画
- HTTP Status 404(The requested resource is not available)的几种解决方案 [问题点数:20分,结帖人defonds]
- [C++]关于重载运算符的一些建议
- Iwfu-贝塞尔曲线配合动画效果的小例子
- xxx cannot be resolved to a type 错误解决方法
- 6. ZigZag Conversion
- AVI封装
- 带预览的图片浏览器
- 做一个简单的彩票生成器
- Scrum开发基础知识
- SSH 中Spring-data-redis使用(使用baseService)
- android 高德地图Demo 的使用
- 面向对象三大基本特性,五大基本原则
- Java从零开始之容器
- 详解-Android各种提示框