通過編程實(shí)現(xiàn)調(diào)整PCM的音量,具體做法是乘上一個(gè)固定的數(shù),但是要考慮數(shù)據(jù)的溢出問題,代碼如下:
//調(diào)節(jié)PCM數(shù)據(jù)音量
//comment : 對(duì)PCM數(shù)據(jù)的音量進(jìn)行放大
//parameter :
// pData PCM數(shù)據(jù)
// nLen PCM數(shù)據(jù)的長(zhǎng)度
// nBitsPerSample 每個(gè)Sample的位數(shù),一般為8的整數(shù)
// multiple 放大倍數(shù)
//result : S_OK 成功
int AmplifyPCMData(BYTE* pData, int nLen, int nBitsPerSample, float multiple)
{
int nCur = 0;
if (16 == nBitsPerSample)
{
while (nCur < nLen)
{
short* volum = (short*)(pData + nCur);
*volum = (*volum) * multiple;
if (dwData < -0x8000)
{
dwData = -0x8000;
}
if (*volum > SHRT_MAX)//爆音的處理
{
*volum = SHRT_MAX;
}
*(short*)(pData + nCur) = *volum ;
nCur += 2;
}
}
else if (8 == nBitsPerSample)
{
while (nCur < nLen)
{
BYTE* volum = pData + nCur;
*volum = (*volum) * multiple;
if (*volum > 255)//爆音的處理
{
*volum = 255;
}
*pData = *volum ;
nCur ++;
}
}
return S_OK;
}
調(diào)整完后效果可以使用Audacity對(duì)比:

image.png