评论

收藏

[C++] 音频格式G711转PCM的代码

编程语言 编程语言 发布于:2021-08-06 15:01 | 阅读数:575 | 评论:0

今天调试摄像头的音频格式,始终不对。原始音频为8000,16位,帧率50。每帧的数据应该是320字节。
接收到手上,RTP包为171字节,数据为160,只有一半。这是怎么回事?一开始总是认为RTP接收有问题,反复核查确认代码及流程正确。那么就是格式进行了转换。什么格式?开始认为是AAC,后来发现不对,AAC压缩率更高。
最后根据这个160、 320,搜索了一个,说G711会变成原来的一半。赶紧试试,果然成功。代码如下:
public static byte[] convertG711ToPcm(byte[] g711Buffer, int length, byte[] pcmBuffer)
{
if (pcmBuffer == null)
{
pcmBuffer = new byte[length*2];
}
for (int i=0; i<length; i++)
{
byte alaw = g711Buffer[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;
}

关注下面的标签,发现更多相似文章