g08176 2016-04-18 09:26
浏览 1393

如何在Android 下用jni调用下面c代码进行g711编码?

unsigned char encode(short pcm);
short decode(unsigned char alaw);

/** 个人理解

  • bitsize 应该为16, pBuffer(pcm数据) 两个char 合成一个 short ,长度自然就是原来的一半(nBufferSize/2),
  • 通过编码后short类型的数据变为char类型,让后复制给pCodecBits
    /
    int g711_encode(unsigned char
    pCodecBits, const char* pBuffer, int nBufferSize)
    {
    short* buffer = (short*)pBuffer;
    int i;
    for(i=0; i<nBufferSize/2; i++)
    {
    pCodecBits[i] = encode(buffer[i]);
    }

    return nBufferSize/2;
    }

/** 个人理解

  • bitsize 应该为16, pcm 数组的宽度变为原来两倍(short out_data = (short)pRawData;),
  • 通过对pBuffer(g711数据)中char解码转为两个字节的short ,后复制给out_data数组, 在使用的时候又转为char类型, 则 解码后的数据就是原来的两倍(nBufferSize*2)
    /
    int g711_decode(char
    pRawData, const unsigned char* pBuffer, int nBufferSize)
    {
    short out_data = (short)pRawData;
    int i;
    for(i=0; i<nBufferSize; i++)
    {
    out_data[i] = decode(pBuffer[i]);
    }

    return nBufferSize*2;
    }

#define MAX 32635
unsigned char encode(short pcm)
{
int sign = (pcm & 0x8000) >> 8;
if (sign != 0)
pcm = -pcm;
if (pcm > MAX) pcm = MAX;
int exponent = 7;
int expMask;
for (expMask = 0x4000; (pcm & expMask) == 0
&& exponent>0; exponent--, expMask >>= 1) { }
int mantissa = (pcm >> ((exponent == 0) ? 4 : (exponent + 3))) & 0x0f;
unsigned char alaw = (unsigned char)(sign | exponent << 4 | mantissa);
return (unsigned char)(alaw^0xD5);
}

short decode(unsigned char alaw)
{
alaw ^= 0xD5;
int sign = alaw & 0x80;
int exponent = (alaw & 0x70) >> 4;
int data = alaw & 0x0f;
data <<= 4;
data += 8;
if (exponent != 0)
data += 0x100;
if (exponent > 1)
data <<= (exponent - 1);

return (short)(sign == 0 ? data : -data);

}

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 c++头文件不能识别CDialog
    • ¥15 Excel发现不可读取的内容
    • ¥15 UE5#if WITH_EDITOR导致打包的功能不可用
    • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
    • ¥20 yolov5自定义Prune报错,如何解决?
    • ¥15 电磁场的matlab仿真
    • ¥15 mars2d在vue3中的引入问题
    • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面
    • ¥15 算法题:数的划分,用记忆化DFS做WA求调
    • ¥15 chatglm-6b应用到django项目中,模型加载失败