kenlistian

厚积薄发. 勤为桨,思为帆

   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  73 随笔 :: 4 文章 :: 22 评论 :: 0 Trackbacks


几个格式细节备记(混)


typedef struct  _MediaType {
    GUID      majortype; 
    GUID      subtype;
    BOOL      bFixedSizeSamples;
    BOOL      bTemporalCompression;
    ULONG     lSampleSize;
    GUID      formattype;
    IUnknown  *pUnk;                  //not use
    ULONG     cbFormat;
    BYTE *pbFormat;
} AM_MEDIA_TYPE;

主要有
   majortype  媒体类型大致说明
   subtype    更一步的细致说明
   formattype 
      包括有以下:其对应的不同的数据格式
       FORMAT_None
       FORMAT_DvInfo
       FORMAT_MPEGVideo
       FORMAT_MPEG2Video
       FORMAT_VideoInfo
       FORMAT_VideoInfo2 
       FORMAT_WaveFormatEx  
       GUID_NULL

  cbForamt成员指定了格式块pbFormat的大小.
  pbFormat指针指向格式子块。
            pbFormat是一个void*的指针,因为格式块会因为媒体类型
            的不同而有不同的指向。如音频填充的是WAVEFORMATEX结构
     数据.

     可以从中取出传来的数据格式。
    

 

//TWaveFormatEx 结构:
TWaveFormatEx = packed record
  wFormatTag: Word;       {指定格式类型; 默认 WAVE_FORMAT_PCM = 1;}
  nChannels: Word;        {指出波形数据的通道数; 单声道为 1, 立体声为 2}
  nSamplesPerSec: DWORD;  {指定样本速率(每秒的样本数)}一般为8000
  nAvgBytesPerSec: DWORD; {指定数据传输的平均速率(每秒的字节数)} 每秒的字节数:
  nBlockAlign: Word;      {指定块对齐(单位字节), 块对齐是数据的最小单位}
  wBitsPerSample: Word;   {采样大小(字节)}每个样本的BIT数目,一般为16
  cbSize: Word;           {应该是该结构的大小}
end;

nChannels       :   对于pcm,其nchannels不超过2,对于非pcm格式,则超过2.
nSamplesPerSec  :   通常为8kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz.
nAvgBytesPerSec :   每秒传送字节数 = nSamplesPerSec * nBlockAlign
nBlockAlign     :   对齐字节  = nChannels * wBitsPerSample / 8
                    就是表示一个样本的最小字节.
wBitsPerSample  :   在格式默认情况下,一般为8,16,表示的是样本的bit 数

对于一个8位,11k传输的立体声则
nChannels  = 2
nSamplesPerSec(每秒的样本数) = 11025  就是取样数
nBlockAlign  = 2 * 8 / 8= 2           对齐字节,最小样本字节数
nAvgBytesPerSec = 11025 *  2 = 22050
wBitsPerSample  = 8
 

 下面的图列清楚从另一个方面表达样本
 样本1  样本2 ...n
8位单声道 0声道 0声道
8位立体声 0声道L         1声道R  0声道L  1声R道
16位单声道 0声道(低字节)    0声道(高字节) 0声道(低字节)    0声道(高字节)
16位立体声

0声道(低字节)0声道(高字节)1声道(低) 1声道(高) 

同左

                                                                                                                     
                                        
                                   
---------

waveform-audio 缓存格式     
  typedef   struct   {    
          LPSTR     lpData;           //内存指针,放置音频pcm样本数据
          DWORD     dwBufferLength;   //长度    
          DWORD     dwBytesRecorded;  //已录音的字节长度  
          DWORD     dwUser;    
          DWORD     dwFlags;    
          DWORD     dwLoops;           //循环次数  
          struct   wavehdr_tag* lpNext; //保留    
          DWORD     reserved;           //保留
  }   WAVEHDR; 
 
  其中lpdata 即为pcm格式样本数据。
 
采样大小为8位,则采样的动态范围为20*log(256)分贝=48db。
样本大小为16位,则采样动态范围为20*log(65536)大约是96分贝

振幅大小:   20*log(A1/A2)分贝,A1,A2为两个声音的振幅。
则对于的音频:
          8位       20 * lg( lpData[0] /256)
   16位      20 * lg( lpData[0]--lpData[1] / 65536)
 考虑到单双道,还需要相应取出左右声道的值。
 考虑到lg求值为负48至0之间,则在实际转换中需要+48or96.


样本大小  数据格式      最大值  最小值
8位PCM    unsigned int   256     0
16位PCM   int            32767  -32767

 8位音频是unsigned 存放波形,取振幅要-127.
 而16位因其存放为int 类型,直接套用公式.
 

audiometer左右声道音量探测程序(参考代码(delphi版

 

posted on 2009-01-05 14:16 kenlistian 阅读(780) 评论(0)  编辑 收藏 引用 所属分类: directx

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理