zoukankan      html  css  js  c++  java
  • G711编解码

    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. }  
  • 相关阅读:
    二十六、oracle pl/sql 分页
    二十五、oracle pl/sql进阶--控制结构(分支,循环,控制)
    二十四、oracle pl/sql 变量
    python笔记之字典
    python笔记之元祖
    python笔记之列表
    python笔记之字符串
    python笔记之数据类型
    python笔记之python基础
    在windows系统电脑上同时安装python2.x和python3.x版本
  • 原文地址:https://www.cnblogs.com/qq260250932/p/4231104.html
Copyright © 2011-2022 走看看