天天看點

音頻格式G711轉PCM的代碼

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

繼續閱讀