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音频 编解码学习笔 ...
随机推荐
- IIS7.0+部署ARR负载均衡
安装: 1. 安装IIS(需要附带相关的健康检查,需要原始的那个默认站点) 2. 安装ARR相关的文件 3. 安装好之后,IIS里会出现有Server Farms的节点,直接创建服务器. 站点对 ...
- 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 ...
- JAVA I/O系统
一.流的分类 1.按照方向分为: (1)输入流:从数据源读取数据到程序中.只能从中读取数据,不能向其中写入数据.IO包中的输入流都继承自抽象类InputStream或Reader. (2)输出流:经数 ...
- [LintCode] Swap Nodes in Pairs 成对交换节点
Given a linked list, swap every two adjacent nodes and return its head. Example Given 1->2-> ...
- GUID相关知识。。。。转载
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络 ...
- javax.el.PropertyNotFoundException: 异常处理
javax.el.PropertyNotFoundException: Property 'policyId' not found on type com.omhy.common.model.enti ...
- HDU5831
Rikka with Parenthesis II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- CentOS下IP的配置
1.打开命令窗口,切换成root账户:su - root 2.进入目录:/etc/sysconfig/network-scripts,打开文件vi ifcfg-eth0 3.修改参数: ## 名称DE ...
- JS的Touch事件们,触屏时的js事件
丫的,终于找到了JS在平板电脑上的事件!!! iphone.ipod Touch.ipad触屏时的js事件 1.Touch事件简介 pc上的web页面鼠标会产生onmousedown.on ...
- 实验四 Android开发基础
实验四 Android开发基础 实验内容 1.安装Android Studio 2.运行安卓AVD模拟器 3.使用安卓运行出虚拟手机并显示HelloWorld以及自己的学号 (一)SDK的安装 (二) ...