Android - 改變PCM數據音量大小

 



int db = 6; // 範圍:+30(最大聲) ~ 0(原始音量) ~ -96(最小聲)Step2
private double factor = Math.pow(10, (double)db/20); // 分貝公式 y = 20 * log10(x)

// 取得 16bit 採樣率的完整數據
private short getShort(byte[] data, int start) {
return (short)((data[start] & 0xFF) | ((data[start+1] << 8) & 0xFF00));
}

/* 調整 PCM 數據音量
* pData:原始音頻數據
* nLen:原始音頻數據長度
* data2:轉換後新音頻數據
* nBitsPerSample:採樣率
* multiple:表示增益值 (需代入公式計算結果,在這裡即是 factor)
*/
public int amplifyPCMData(byte[] pData, int nLen, byte[] data2, int nBitsPerSample, float multiple)
{
int nCur = 0;
float pcmval;
if (nBitsPerSample == 16) {
short volum;
while (nCur < nLen) {
volum = getShort(pData, nCur);
// volum <<= 1;
// volum = (short)(volum * multiple);
pcmval = (volum * multiple);
if(volum < -32768)
volum = -32768;
else if(volum > 32767)
volum = 32767;
else
volum = (short)pcmval;
data2[nCur] = (byte)( volum & 0xFF);
data2[nCur+1] = (byte)((volum >> 8) & 0xFF);
nCur += 2;
}
} else if(nBitsPerSample == 8) {
byte volum;
while (nCur < nLen) {
volum = pData[nCur] & 0xFF;
pcmval = (volum * multiple);
if(volum < -127)
volum = -127;
else if(volum > 128)
volum = 128;
else
volum = (byte)(pcmval);
data2[nCur] = (byte)(volum & 0xFF);
nCur++;
}
}
return 0;
}




參考:


沒有留言:

張貼留言