针对国内的博客或者技术论坛对 ILBC的论述都是把文章抄来抄去, 本人在此对 ILBC的具体代码实现详细列出代码.

ILBC是由Global IP Sound公司提出的一种专为包交换网络通信设计的编解码,优于目前流行的G.729A、G.723.1,对丢包进行了特殊处理,既使在丢包率相当高的网络环境下,仍可获得非常清晰的语音效果。
    ILBC 对于20 ms的帧,共使用了304个比特来表示编码后的语音信号,被封装在38个字节中;对于30ms的帧,共使用了480个比特,封装在50个字节中。

1.  ILBC的编译

ILBC代码部分是网络上找的,    点此下载.

dll和lib(使用的是20 ms的帧)  点此下载.

2. 与PCM结合编解码.

ILBC对WaveFormat的值有要求, 即下列代码的@FFormat, 取其他值时会有问题.

PCMFormat: TWaveFormatEx = (
    wFormatTag: WAVE_FORMAT_PCM;
    nChannels: 1;
    nSamplesPerSec: 8000; 
    nAvgBytesPerSec: 16000;
    nBlockAlign: 2;
    wBitsperSample: 16; 
    cbSize: 0 );

由于使用的是20 ms的帧, 1秒应该是回调50次, 每次的语音数据为320字节.

即FRecBufferSize的值取50

FDataSize:= FFormat.nAvgBytesPerSec div DWORD(RecBufferSize);
GetMem(FWaveID,sizeof(HWaveIn));
i := WaveInOpen(FWaveID, WAVE_MAPPER, @FFormat, DWORD(@waveInCallback),
DWORD(Self), CALLBACK_FUNCTION);
if i=MMSYSERR_NOERROR then
else begin
FActive := False;
Exit;
end;
for I:= to FRecBufferSize do
AddPrepareBuffer;
WaveInStart(FWaveID^);
FActive:= True;

以下函数为PCM数据回调后编码

procedure TTalkClass.DoRecordData(Data: Pointer; size: Integer);
var
pEncodeBuf: array[..] of Byte;
eSize: Integer;
begin
//先进行编码 压缩
eSize := ilbc_encoder(Data, @pEncodeBuf);
if Assigned(FOnTalkData) then
FOnTalkData(@pEncodeBuf, eSize); //已经编码的数据 -> 压缩后的
end;

然后进行ilbc解码和播放

function TTalkClass.PlayData(pData: PByte; size: Integer): Boolean;
var
pDecodeBuf: array [..-] of SHORT;
eSize: Integer;
begin
//传入的是编码后的数据 先解码
eSize := ilbc_decoder(pData, @pDecodeBuf);
FWaveOut.WriteData(@pDecodeBuf, eSize*);
end;

这个地方必须要注意eSize*2, 由于ilbc_decoder这个函数解码后的数据为short型数组, 返回值eSize表示的是数组长度.
这个地方不注意的话, 就很有问题了.

再贴一下delphi中引用这个dll的代码

const
Dll = 'ilbc.dll'; function ilbc_init(): Boolean; stdcall; external Dll name '_ilbc_init@0';
function ilbc_encoder(pin: Pointer; pout: PByte): Integer; stdcall; external Dll name '_ilbc_encoder@8';
function ilbc_decoder(pin: PByte; pout: Pointer): Integer; stdcall; external Dll name '_ilbc_decoder@8';

需要编码后的ilbc语音数据的点此下载.  用文件流读取时记得每次取38字节进行解码.

最后声明下我说的只是个人这几天的心得, 有什么说的不对的请指正.

ilbc编解码的更多相关文章

  1. ilbc编解码在android实现

    iLBC 是为专为提供稳健的 IP 语音通信而开发的语音 codec,以窄带语音为设计基础,具有 8 kHz 的采样率.iLBC codec 支持两种基本的帧长度:13.3 kbps 比特率下编码帧长 ...

  2. 各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放 license收费等 ...

  3. android 音频编解码1

    1. Android 官方的 MediaCodec API 该 API 是在 Andorid 4.1 (API 16) 版本引入的 MediaCodec 使用的基本流程是: 1234567891011 ...

  4. 集显也能硬件编码:Intel SDK && 各种音视频编解码学习详解

    http://blog.sina.com.cn/s/blog_4155bb1d0100soq9.html INTEL MEDIA SDK是INTEL推出的基于其内建显示核心的编解码技术,我们在播放高清 ...

  5. 我的Android进阶之旅------>Android中编解码学习笔记

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  6. IP通信中音频编解码技术与抗丢包技术概要

    此文较长,建议收藏起来看. 一.一个典型的IP通信模型 二.Server2Server技术分类 Server2Server这块也是一个专门的领域,这里只简单分个类. 1.同一国家相同运营商之间: 同一 ...

  7. Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能

    最近老大要求做一个类米聊的app,于是就去找解决方案,首先用Android本身的MediaRecorder肯定是不行的,只支持amr,wav,acc,如果要做到Android,Iphone,pc通用的 ...

  8. 【miscellaneous】各种音视频编解码学习详解

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  9. 【FFMPEG】各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式

    目录(?)[-] 编解码学习笔记二codec类型 编解码学习笔记三Mpeg系列Mpeg 1和Mpeg 2 编解码学习笔记四Mpeg系列Mpeg 4 编解码学习笔记五Mpeg系列AAC音频 编解码学习笔 ...

随机推荐

  1. IIS7.0+部署ARR负载均衡

    安装: 1.  安装IIS(需要附带相关的健康检查,需要原始的那个默认站点) 2.  安装ARR相关的文件 3.  安装好之后,IIS里会出现有Server Farms的节点,直接创建服务器. 站点对 ...

  2. How to pull Android database to local file system

    >adb shell# ls /data/data/PACKAGE_NAME/databases# exit// pull it>adb pull /data/data/PACKAGE_N ...

  3. JAVA I/O系统

    一.流的分类 1.按照方向分为: (1)输入流:从数据源读取数据到程序中.只能从中读取数据,不能向其中写入数据.IO包中的输入流都继承自抽象类InputStream或Reader. (2)输出流:经数 ...

  4. [LintCode] Swap Nodes in Pairs 成对交换节点

    Given a linked list, swap every two adjacent nodes and return its head.   Example Given 1->2-> ...

  5. GUID相关知识。。。。转载

              全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络 ...

  6. javax.el.PropertyNotFoundException: 异常处理

    javax.el.PropertyNotFoundException: Property 'policyId' not found on type com.omhy.common.model.enti ...

  7. HDU5831

    Rikka with Parenthesis II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. CentOS下IP的配置

    1.打开命令窗口,切换成root账户:su - root 2.进入目录:/etc/sysconfig/network-scripts,打开文件vi ifcfg-eth0 3.修改参数: ## 名称DE ...

  9. JS的Touch事件们,触屏时的js事件

    丫的,终于找到了JS在平板电脑上的事件!!!   iphone.ipod Touch.ipad触屏时的js事件   1.Touch事件简介   pc上的web页面鼠标会产生onmousedown.on ...

  10. 实验四 Android开发基础

    实验四 Android开发基础 实验内容 1.安装Android Studio 2.运行安卓AVD模拟器 3.使用安卓运行出虚拟手机并显示HelloWorld以及自己的学号 (一)SDK的安装 (二) ...