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. }  
  • 相关阅读:
    Proj THUDBFuzz Paper Reading: The Art, Science, and Engineering of Fuzzing: A Survey
    Proj THUDBFuzz Paper Reading: A systematic review of fuzzing based on machine learning techniques
    9.3 付费代理的使用
    11.1 Charles 的使用
    第十一章 APP 的爬取
    10.2 Cookies 池的搭建
    10.1 模拟登录并爬取 GitHub
    11.5 Appium 爬取微信朋友圈
    11.4 Appium 的基本使用
    11.3 mitmdump 爬取 “得到” App 电子书信息
  • 原文地址:https://www.cnblogs.com/qq260250932/p/4231104.html
Copyright © 2011-2022 走看看