针对国内的博客或者技术论坛对 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. MVVM Command Binding: InvokeCommandAction v.s. EventToCommand

    This gives you the ability to create a trigger on an event and bind it to an ICommand on the view mo ...

  2. 接口(Java)

    什么是接口:接口就是一些方法特征的集合,接口是对抽象的抽象. 在java语言中,接口有两种意思: ①概念性的接口,即系统对外提供的所有服务 ②指用interface关键字定义的接口,也称为接口类型 特 ...

  3. c# 哈希表跟函数

    一.哈希表集合 先进后出,一个一个赋值,但只能一起取值. 1.哈希表的建立.赋值以及读取. 2.利用枚举类型打印出集合中的Key值和Value值. 二.函数 函数:能够独立完成某项功能的模块. 函数四 ...

  4. webapp 侧边导航效果

    @media (max-width: 767px) .main-sidebar, .left-side { -webkit-transform: translate(-230px, 0); -ms-t ...

  5. 移动端设备UA检测

    网上找到的都不全,不是漏这个就是漏那个,有的甚至还把桌面的chrome判断为移动浏览器. 于是自己动手整理,这回算是比较全了.以后发现漏掉的立马加上. if(/AppleWebKit.*Mobile/ ...

  6. php+curl上传文件

    因为公司项目用java做的,需要我这边用php上传文件.只给了个接口,参数都不明确,然后这边不提交表单,在生成pdf之后就立马上传.用了php+curl,总是没上传成功,这里看到了篇文章http:// ...

  7. 条件查询,有input和select框,当查询条件获取焦点时支持摁下enter键查询

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. 20145334赵文豪 《Java程序设计》第4周学习总结

    20145334赵文豪 <Java程序设计>第4周学习总结 教材学习内容总结 第六章知识点总结 1-继承共同行为:如果在程序设计上存在着重复,那就需要修改,可以吧相同的程序代码提升(pul ...

  9. profile

    项目开发中,使用git最为版本控制工具,往往会建立开发分支.测试分支和生产分支. 各个分支的数据库url,所依赖的接口url可能不同,直接配置的话,在合并分支时往往出现冲突.使用profile可以有效 ...

  10. centos yum 使用笔记

    yum 参数说明yum -y # 表示自动选择 基本使用# yum -y install 包名(支持*) :自动选择y,全自动# yum install 包名(支持*) :手动选择y or n# yu ...