纯搬运留存,源码出处 https://blog.youkuaiyun.com/quantum7/article/details/80836289
亲测转换可用
/**
* 将g711a a-law 数据转换为 pcm
*
* @param encoded
* @return
*/
public static byte[] decodeG711a2Pcm(byte[] encoded) {
int length = encoded.length;
byte[] pcmBuffer = new byte[length*2];
for (int i=0; i<length; i++)
{
byte alaw = encoded[i];
alaw ^= 0xD5;
int sign = alaw & 0x80;
int exponent = (alaw & 0x70) >> 4;
// 这个移位多此一举?结果应该一直是8
int value = (alaw & 0x0F) >> 4 + 8;
if (exponent != 0)
{
value += 0x0100;
}
if (exponent > 1)
{
value <<= (exponent - 1);
}
value = (char)((sign == 0 ? value : -value) & 0xFFFF);
pcmBuffer[i*2+0] = (byte) (value & 0xFF);
pcmBuffer[i*2+1] = (byte) (value >> 8 & 0xFF);
}
return pcmBuffer;
}
测试代码
FileInputStream inputStream = new FileInputStream("d:\\mq.g711a");
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
byte[] pcmBytes = decodeG711a2Pcm(bytes);
new FileOutputStream("d:\\mq.wav").write(pcmBytes);