织梦CMS - 轻松建站从此开始!

罗索

G711编解码

jackyhwei 发布于 2011-12-17 13:23 点击:次 
搞语音对讲几天了,播放时声音干扰太大了。拖得时间久有两个原因: 1.每次采样的位数这个值设置的问题。本来是用的采样位数为16,但是服务端那边说用8。导致编解码时8位的始终有杂音。 1.G711编解码的问题:用了一个错误的编解码程序。目前用的编解码代码对于8为始终有
TAG:

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

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

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

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

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

 

(rightorwrong)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201112/15494.html]
本文出处:CSDN博客 作者:rightorwrong 原文
顶一下
(4)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容