今天調試攝像頭的音頻格式,始終不對。原始音頻為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;
}