码迷,mamicode.com
首页 > 其他好文 > 详细

G711编解码

时间:2015-01-17 22:13:42      阅读:391      评论:0      收藏:0      [点我收藏+]

标签:

http://blog.csdn.net/rightorwrong/article/details/4209467

搞语音对讲几天了,播放时声音干扰太大了。拖得时间久有两个原因:

1.每次采样的位数这个值设置的问题。本来是用的采样位数为16,但是服务端那边说用8。导致编解码时8位的始终有杂音。

1.G711编解码的问题:用了一个错误的编解码程序。目前用的编解码代码对于8为始终有杂音

下面把编解码的代码放在这里,16为采集效果很好

  1. //编码  
  2. int CG711Decoder::G711_EnCode(unsigned char* pCodecBits, const char* pBuffer, int nBufferSize)  
  3. {  
  4.     short* buffer = (short*)pBuffer;  
  5.     for(int i=0; i<nBufferSize/2; i++)  
  6.     {  
  7.         pCodecBits[i] = encode(buffer[i]);  
  8.     }  
  9.   
  10.     return nBufferSize/2;  
  11. }   
  12.   
  13. //解码  
  14. int CG711Decoder::G711_Decode(char* pRawData, const unsigned char* pBuffer, int nBufferSize)  
  15. {  
  16.     short *out_data = (short*)pRawData;  
  17.     for(int i=0; i<nBufferSize; i++)  
  18.     {  
  19.         out_data[i] = decode(pBuffer[i]);  
  20.     }  
  21.       
  22.     return nBufferSize*2;  
  23. }  
  24.   
  25. #define MAX (32635)  
  26. unsigned char CG711Decoder::encode(short pcm)  
  27. {  
  28.     int sign = (pcm & 0x8000) >> 8;  
  29.     if (sign != 0)  
  30.         pcm = -pcm;  
  31.     if (pcm > MAX) pcm = MAX;  
  32.     int exponent = 7;  
  33.     int expMask;  
  34.     for (expMask = 0x4000; (pcm & expMask) == 0   
  35.         && exponent>0; exponent--, expMask >>= 1) { }  
  36.     int mantissa = (pcm >> ((exponent == 0) ? 4 : (exponent + 3))) & 0x0f;  
  37.     unsigned char alaw = (unsigned char)(sign | exponent << 4 | mantissa);  
  38.     return (unsigned char)(alaw^0xD5);  
  39. }  
  40. short CG711Decoder::decode(unsigned char alaw)  
  41. {  
  42.     alaw ^= 0xD5;  
  43.     int sign = alaw & 0x80;  
  44.     int exponent = (alaw & 0x70) >> 4;  
  45.     int data = alaw & 0x0f;  
  46.     data <<= 4;  
  47.     data += 8;  
  48.     if (exponent != 0)  
  49.         data += 0x100;  
  50.     if (exponent > 1)  
  51.         data <<= (exponent - 1);  
  52.       
  53.     return (short)(sign == 0 ? data : -data);  
  54. }  

G711编解码

标签:

原文地址:http://www.cnblogs.com/qq260250932/p/4231104.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!