AVI文件头格式浅析-计算音视频播放时长

因为需要计算一个AVI文件的播放时间所以看一下AVI文件头所包涵的信息

 

下面一个结构框图

 

"avih"子块:

typedefstruct_avimainheader{
  FOURCC fcc;//必须为‘avih’
  DWORD cb;//本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)structsize
  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;

"strh"子块:

typedefstruct_avistreamheader{
  FOURCC 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{
      shortint left;
      shortint top;
      shortint right;
      shortint bottom;
  }rcFrame;//指定这个流(视频流或文字流)在视频主窗口中的显示位置
  //视频主窗口由AVIMAINHEADER结构中的dwWidth和dwHeight决定
}AVISTREAMHEADER;

"strf"子块:

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;

 

Index子块:

typedefstruct_avioldindex{

  FOURCCfcc;//必须为‘idx1’
  DWORDcb;//本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
  struct_avioldindex_entry{
       DWORDdwChunkId;//表征本数据块的四字符码
       DWORDdwFlags;//说明本数据块是不是关键帧、是不是‘rec’列表等信息
       DWORDdwOffset;//本数据块在文件中的偏移量
       DWORDdwSize;//本数据块的大小
  }aIndex[];//这是一个数组!为每个媒体数据块都定义一个索引信息
}AVIOLDINDEX;

 

Video:dwScale,dwRate,dwLength,AVI中视频播放时长是dwLength/(dwRate/dwScale),如dwScale=0x64、dwRate=0xbb5、dwLength=0x6ED,(0x6ED/(0xBB5/0x64))=60秒

 

Audio:Length=5624、Scale=16000、Rate=2,对于PCM audio,nBlockAlign与dwSampleSize相等,为2,及每个音频采样为两个字节,每个音频帧的大小为1024B,而dwRate/dwScale即为采样率:16000/2=8000,因此,音频时长:

(5624* 1024 / 2) / (16000 / 2) = 360秒。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值