幾個格式細節(jié)備記(混)
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
包括有以下:其對應的不同的數(shù)據(jù)格式
FORMAT_None
FORMAT_DvInfo
FORMAT_MPEGVideo
FORMAT_MPEG2Video
FORMAT_VideoInfo
FORMAT_VideoInfo2
FORMAT_WaveFormatEx
GUID_NULL
cbForamt成員指定了格式塊pbFormat的大小.
pbFormat指針指向格式子塊。
pbFormat是一個void*的指針,因為格式塊會因為媒體類型
的不同而有不同的指向。如音頻填充的是WAVEFORMATEX結構
數(shù)據(jù).
可以從中取出傳來的數(shù)據(jù)格式。
//TWaveFormatEx 結構:
TWaveFormatEx = packed record
wFormatTag: Word; {指定格式類型; 默認 WAVE_FORMAT_PCM = 1;}
nChannels: Word; {指出波形數(shù)據(jù)的通道數(shù); 單聲道為 1, 立體聲為 2}
nSamplesPerSec: DWORD; {指定樣本速率(每秒的樣本數(shù))}一般為8000
nAvgBytesPerSec: DWORD; {指定數(shù)據(jù)傳輸?shù)钠骄俾?每秒的字節(jié)數(shù))} 每秒的字節(jié)數(shù):
nBlockAlign: Word; {指定塊對齊(單位字節(jié)), 塊對齊是數(shù)據(jù)的最小單位}
wBitsPerSample: Word; {采樣大小(字節(jié))}每個樣本的BIT數(shù)目,一般為16
cbSize: Word; {應該是該結構的大小}
end;
nChannels : 對于pcm,其nchannels不超過2,對于非pcm格式,則超過2.
nSamplesPerSec : 通常為8kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz.
nAvgBytesPerSec : 每秒傳送字節(jié)數(shù) = nSamplesPerSec * nBlockAlign
nBlockAlign : 對齊字節(jié) = nChannels * wBitsPerSample / 8
就是表示一個樣本的最小字節(jié).
wBitsPerSample : 在格式默認情況下,一般為8,16,表示的是樣本的bit 數(shù)
對于一個8位,11k傳輸?shù)牧Ⅲw聲則
nChannels = 2
nSamplesPerSec(每秒的樣本數(shù)) = 11025 就是取樣數(shù)
nBlockAlign = 2 * 8 / 8= 2 對齊字節(jié),最小樣本字節(jié)數(shù)
nAvgBytesPerSec = 11025 * 2 = 22050
wBitsPerSample = 8
下面的圖列清楚從另一個方面表達樣本
|
樣本1 |
樣本2 |
...n |
8位單聲道 |
0聲道 |
0聲道 |
|
8位立體聲 |
0聲道L 1聲道R |
0聲道L 1聲R道 |
|
16位單聲道 |
0聲道(低字節(jié)) 0聲道(高字節(jié)) |
0聲道(低字節(jié)) 0聲道(高字節(jié)) |
|
16位立體聲 |
0聲道(低字節(jié))0聲道(高字節(jié))1聲道(低) 1聲道(高)
|
同左
|
|
---------
waveform-audio 緩存格式
typedef struct {
LPSTR lpData; //內(nèi)存指針,放置音頻pcm樣本數(shù)據(jù)
DWORD dwBufferLength; //長度
DWORD dwBytesRecorded; //已錄音的字節(jié)長度
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops; //循環(huán)次數(shù)
struct wavehdr_tag* lpNext; //保留
DWORD reserved; //保留
} WAVEHDR;
其中l(wèi)pdata 即為pcm格式樣本數(shù)據(jù)。
采樣大小為8位,則采樣的動態(tài)范圍為20*log(256)分貝=48db。
樣本大小為16位,則采樣動態(tài)范圍為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.
樣本大小 數(shù)據(jù)格式 最大值 最小值
8位PCM unsigned int 256 0
16位PCM int 32767 -32767
8位音頻是unsigned 存放波形,取振幅要-127.
而16位因其存放為int 類型,直接套用公式.
audiometer左右聲道音量探測程序(參考代碼(delphi版)