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:= 1 to FRecBufferSize do
        AddPrepareBuffer;
      WaveInStart(FWaveID^);
      FActive:= True;

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

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

然后进行ilbc解码和播放

function TTalkClass.PlayData(pData: PByte; size: Integer): Boolean;
var
  pDecodeBuf: array [0..160-1] of SHORT;
  eSize: Integer;
begin
  //传入的是编码后的数据  先解码
  eSize := ilbc_decoder(pData, @pDecodeBuf);
  FWaveOut.WriteData(@pDecodeBuf, eSize*2);
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字节进行解码.

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

 

 

  

 

转载于:https://www.cnblogs.com/doorsky/p/3266102.html

Epic客户端启动出现闪退问题,可能由多种因素引起,包括软件冲突、系统兼容性问题、驱动程序不兼容或缓存数据损坏等。以下是一些常见的排查和解决方法: ### 检查系统兼容性和更新 确保操作系统已更新至最新版本,并安装了所有必要的系统更新Epic客户端对Windows系统的版本有一定要求,如果系统未及更新,可能会导致兼容性问题。此外,检查DirectX运行库是否为最新版本[^1]。 ### 清除Epic客户端缓存 有缓存文件的损坏会导致客户端无法正常启动。可以尝试清除Epic Games Store的缓存数据: 1. 打开文件资源管理器,进入路径:`C:\Users\你的用户名\AppData\Local\EpicGamesLauncher\Saved\Logs` 2. 删除该目录下的所有日志文件。 3. 进入 `C:\Users\你的用户名\AppData\Local\EpicGamesLauncher\Saved\Config\Windows` 目录。 4. 将其中的配置文件备份后删除。 ### 重新安装Epic客户端 卸载当前安装的Epic Games Launcher并重新下载安装最新版本。在卸载前,建议使用专门的清理工具(如Revo Uninstaller)以确保彻底删除所有残留文件。重新安装后尝试启动客户端。 ### 禁用防病毒软件或防火墙 某些安全软件可能会阻止Epic客户端正常运行。临禁用杀毒软件或Windows Defender防火墙,查看是否仍存在闪退问题。如果问题消失,则需要调整安全软件的设置或将其加入白名单。 ### 使用兼容模式运行 右键点击Epic启动器快捷方式,选择“属性”,切换到“兼容性”选项卡,勾选“以管理员身份运行”,并尝试将运行模式设置为与操作系统更兼容的选项(例如Windows 10兼容模式)。 ### 更新显卡驱动 显卡驱动过旧也可能导致客户端崩溃。前往显卡制造商官网(如NVIDIA、AMD或Intel)下载并安装最新的驱动程序。 ### 示例代码:批量删除日志文件 ```batch @echo off setlocal :: 设置日志目录路径 set LOG_DIR="%APPDATA%\..\Local\EpicGamesLauncher\Saved\Logs" set CONFIG_DIR="%APPDATA%\..\Local\EpicGamesLauncher\Saved\Config\Windows" :: 删除日志文件 if exist %LOG_DIR% ( del /q %LOG_DIR%\* ) :: 删除配置文件(可选) if exist %CONFIG_DIR% ( del /q %CONFIG_DIR%\* ) echo 缓存和日志文件已清除,重启Epic客户端。 pause ``` 保存上述内容为 `.bat` 文件并双击运行,可以快速清理相关文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值