WAVEFORMATEX
MEDIATYPE_Audio
FORMAT_WaveFormatEx
CLSID_AudioInputDeviceCategory
CLSID_AudioInputDeviceCategory
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