ilbc编解码
针对国内的博客或者技术论坛对 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编解码的更多相关文章
- ilbc编解码在android实现
iLBC 是为专为提供稳健的 IP 语音通信而开发的语音 codec,以窄带语音为设计基础,具有 8 kHz 的采样率.iLBC codec 支持两种基本的帧长度:13.3 kbps 比特率下编码帧长 ...
- 各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式
编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放 license收费等 ...
- android 音频编解码1
1. Android 官方的 MediaCodec API 该 API 是在 Andorid 4.1 (API 16) 版本引入的 MediaCodec 使用的基本流程是: 1234567891011 ...
- 集显也能硬件编码:Intel SDK && 各种音视频编解码学习详解
http://blog.sina.com.cn/s/blog_4155bb1d0100soq9.html INTEL MEDIA SDK是INTEL推出的基于其内建显示核心的编解码技术,我们在播放高清 ...
- 我的Android进阶之旅------>Android中编解码学习笔记
编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...
- IP通信中音频编解码技术与抗丢包技术概要
此文较长,建议收藏起来看. 一.一个典型的IP通信模型 二.Server2Server技术分类 Server2Server这块也是一个专门的领域,这里只简单分个类. 1.同一国家相同运营商之间: 同一 ...
- Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能
最近老大要求做一个类米聊的app,于是就去找解决方案,首先用Android本身的MediaRecorder肯定是不行的,只支持amr,wav,acc,如果要做到Android,Iphone,pc通用的 ...
- 【miscellaneous】各种音视频编解码学习详解
编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...
- 【FFMPEG】各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式
目录(?)[-] 编解码学习笔记二codec类型 编解码学习笔记三Mpeg系列Mpeg 1和Mpeg 2 编解码学习笔记四Mpeg系列Mpeg 4 编解码学习笔记五Mpeg系列AAC音频 编解码学习笔 ...
随机推荐
- Node.js 手册查询-1-核心模块方法
Node.js 学习手册 标签(空格分隔): node.js 模块 核心模块 核心模块是被编译成二进制代码,引用的时候只需require表示符即可 os 系统基本信息 os模块可提供操作系统的一些基本 ...
- nodejs高大上的部署方式-PM2
1.最常用的属nohup了,其实就是在后台执行进程,末尾加个& [zhoujie@ops-dev ~]$ nohup node /home/zhoujie/ops/app.js & ...
- Json数据格式事例查看
最简单的一种: [{"ProvinceID":1,"ProvinceName":"北京市","DateCreated": ...
- jquery点击区域显示或隐藏DIV,点击非该DIV的地方隐藏该DIV
<div class="Content_top"> <div class="Reserve"> <h3><span c ...
- python--range()函数
1: >>> range(10, 0, -1) [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] >>> range(10) [0, 1, 2, 3, ...
- 关于GreenOdoo的一个Bug
动态创建字段的时候,虽然字段已经创建,但是显示的时候会报没有新创建的字段错误: 但是原版是没有任何问题的,记录一下.
- ThinkPHP的URL优化
在刚刚安装好tp框架时,我们的路径一般是这样的: http://localhost/index.php/Home/Index/index?name=cly 我们可以通过下面一步步的步骤来优化这个路径 ...
- 数位DP HDU2089
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Jquery各个版本的区别
一: 一般原则是越新越好,jQuery版本是在不断进步和发展的,最新版是当时最高技术水平,也是最先进的技术理念. 但个人的角度来看.是最新版本x.x.0的上一版本最好.比如说1.10.0版,上一版本是 ...
- win10我能ping通他人,但他人ping不同我
这是防火墙的原因,关闭防火墙即可