总结网上的G711编解码, 将其一直到andorid系统上去, 通过jni的来进行G711和PCM 的互转,  由于对于这两种格式没有深入的了解,, 所以如果想深入的了解他们可以百度, 在这里只是实现这样的功能罢了.

g711.c 包含编码和解码的方法

//http://www.easydarwin.org/article/Streaming/38.html               参考文章
//https://github.com/EasyDarwin/EasyAACEncoder/blob/master/g711.cpp
//http://www.oschina.net/code/snippet_1173523_38946
//http://blog.csdn.net/rightorwrong/article/details/4209467  PCM 2 G711  G711 2 PCM 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);
}

jni中实现编解码,只贴出主要代码

G711 -> PCM

JNIEXPORT void JNICALL Java_com_ff_aacdemo_jni_G711Coder_g711Topcm(JNIEnv *env, jobject obj){FILE* fpOut = fopen("/storage/emulated/0/t/pcm_to_g711.pcm", "wb");FILE* fpIn = fopen("/storage/emulated/0/t/pcm_to_g711.g711", "rb");//g711格式文件在最后会给出连接int g711_BufferSize = 1024;char g711_Buffer[g711_BufferSize];int len;while((len = fread(g711_Buffer, 1, g711_BufferSize, fpIn)) > 0){LOGD("g711topcm length = %d", len);char pcmBuffer[len];int pcmbufsize = g711_decode(pcmBuffer, g711_Buffer, len);fwrite(pcmBuffer, 1, pcmbufsize, fpOut);}LOGD("g711topcm end");fclose(fpIn);fclose(fpOut);
}

PCM -> G711

JNIEXPORT void JNICALL Java_com_ff_aacdemo_jni_G711Coder_pcmTog711(JNIEnv *env, jobject obj){FILE* fpIn = fopen("/storage/emulated/0/t/pcm_to_g711.pcm", "rb");FILE* fpOut = fopen("/storage/emulated/0/t/pcm_to_g711.g711", "wb");LOGD("pcmTog711 1");int pcm_BufferSize = 1024;char pcm_Buffer[pcm_BufferSize];int len;while((len = fread(pcm_Buffer, 1, pcm_BufferSize, fpIn)) > 0){LOGD("pcmTog711 length = %d", len);char g711Buffer[len];int  g711BufSize = g711_encode(g711Buffer, pcm_Buffer, len);fwrite(g711Buffer, 1, g711BufSize, fpOut);}LOGD("pcmTog711 end");fclose(fpIn);fclose(fpOut);
}

虽然能够实现他们的相互转换, 可是,不怎么好找到播放器播放, 效果始终没有验证, 在下一章中, 将总结将 G711 转换为 AAC , AAC这种格式将能够使用常规的播放器进行播放

g711文件 http://download.csdn.net/detail/yuanzhenhai/2693878

G711编解码(G711与PCM类型互转)相关推荐

  1. TMS320C5509A 语音编解码(G711编解码器)

    此代码适用于其他的平台,纯C语言,不使用第三方库 解码: #include <stdio.h>short decode(unsigned char alaw) {alaw ^= 0xD5; ...

  2. A律十三折线法G711编解码介绍

    A律十三折线法G711编解码介绍 简介 G711国际电信联盟ITU-T定制出来的一套语音压缩标准,主要用于对PCM音频数据编码,将PCM16bit数据压缩为为8Bit,它是主流的波形音频编码器,相当于 ...

  3. Android G711编解码

    话不多说,直接上代码,本人亲测可用. public class G711 {private static short aLawDecompressTable[] = new short[] { -55 ...

  4. aac蓝牙编解码协议_蓝牙音频编码哪个音质好?今天我们来逐一解读

    家有影院致力于帮助渴望学习.热爱电影.希望通过自己双手搭建出适合自己的家庭影院的朋友.如果你是这样的人,我们和500位同样热爱家庭影院的伙伴愿意一起帮助你实现梦想.同时,我们还能帮助你找到价格优惠的靠 ...

  5. Netty使用篇:Http协议编解码

    第一章:概述 Http协议是一个应用层协议.在Http协议之上又构建出来了WebSocket这种双向通信的协议.可以主动在服务端帮我们去推数据,实际上我们现在做一些双向通信的比较很重要的东西,比如:推 ...

  6. C语言使用 ASN.1对报文进行编解码(将c函数封装成类简化使用)

    文章目录 1.为什么要报文编解码 2.ASN.1是什么 3.使用函数介绍 4.对数据进行编解码 5.C语言使用 6.将上述函数封装成c++类 1.为什么要报文编解码 两台机器通信: 1.两台机器的操作 ...

  7. 蓝牙A2DP和HFP编解码

     一.A2DP A2DP全名是(Advanced Audio Distribution Profile) 蓝牙音频传输模型协定,提供通过蓝牙连接传输音频流的能力,比如手机播放音乐,蓝牙耳机通过蓝牙连接 ...

  8. G711(PCM/PCMA/PCMU),G721,G723,G729等 音频编解码

    G711,G721,G723音频编解码,G729音频库,Android G711(PCMA/PCMU).G726.PCM音频转码到AAC,ffmpeg接收g723音频流,Android G726语音编 ...

  9. 音频采样及编解码——LPCM 、ADPCM、G711、G726、AAC

    前言 ~~~~~~~       最近在查看hi3516a音频资料部分,遇到一些音频的专业术语,如LPCM .ADPCM.G711.G726等,故查询了一些资料,对这几个术语进行记录和总结. LPCM ...

最新文章

  1. blog微服务架构代码_聊聊微服务架构
  2. PPR context node destroy logic
  3. ext.net 开发学习之复杂模板板块 (叁)
  4. 将a数组部分给b数组c语言,C语言第6章1 数组.ppt
  5. Django的Modelforms的介绍
  6. Windows 引导修复
  7. PLC模糊控制之模糊化
  8. 值的珍藏!三分钟了解如何用elman神经网络进行预测
  9. 用MarkDown写PPT
  10. TF-IDF算法原理和公式
  11. 物联网知识1---RFID
  12. 刘德华--2初恋时节
  13. Codecademy-中文JavaScript系列教程-Function
  14. Java Web 图说
  15. 王爽 《汇编语言》之寄存器
  16. 企业私域直播可以应用于哪些场景?
  17. jquery mouse事件小坑
  18. 从零开始学习React——(六):React响应式设计和数据绑定
  19. 数字集成电路设计(二、Verilog HDL基础知识)
  20. 使用Selenium含蓄等待获取页面元素(附带实际业务需求情景)

热门文章

  1. CSS网页布局心得(样式优先级,块级元素,内联元素,display,position,float)
  2. 圆桌式开发是什么?如何实现?
  3. VS2017的TensorFlow安装
  4. 《C和指针》笔记(十四)-- 经典抽象数据类型
  5. WeMos下实现垃圾桶感应开盖、保持、合盖
  6. 常见的数据库故障有哪些?
  7. 【Linux】使用linux命令查找应用安装路径
  8. 2007年冲杀职场的10只魔戒(转)
  9. 《汉武大帝》中涉及的一些东西
  10. sentinel下载安装