一、WebRTC的PLC调度策略
GetAudioInternal


只有WebRTC使用opus编解码的时候,才会调用opus的decode,进而调用silk的plc

否则走的都是WebRTC原生的DoExpand函数,使用的是Expand::Process算法。
二、SILK编码的PLC实现原理
结合核心函数silk_PLC实现:
当网络传输发生数据包丢失,解码器无法获得当前帧的编码参数(如 LPC 系数、基音周期、增益等)。为不让音频中断或产生刺耳的噪音,该函数利用前一帧的信息来猜测并合成当前丢失帧的信号,同时随着丢包时间的延长逐渐衰减信号能量,使听感自然过渡到静音。
- 核心设计思想
参数延续 :使用上一帧的 LPC 系数、基音周期(Pitch Lag)和增益。
能量衰减 :随连续丢包数量(lossCnt)增加,逐渐降低信号增益,避免突然静音或持续大声重复。
去周期性 :在重复基音信号时加入随机噪声,防止声音变成单调的"机器人音"或蜂鸣声。
基音漂移 :缓慢增加基音周期,模拟人声自然变化,避免频率锁定。
滤波器稳定化:对上一帧LPC系数进行带宽扩展BWE,防止合成滤波器不稳定导致信号发散。
三、WebRTC原生PLC实现原理
参见如下链接:
四、对比小结
无论是opus的plc还是WebRTC原生的plc,其实都是通过LTP、LPC进行预测、衰减、平滑过渡。
opus的LTP、LPC等参数是编码器带过来的,不用进行重新计算,而WebRTC的plc,在感知到丢包后,会调用历史数据,重新计算LTP和LPC等参数信息,实际测试效果上没太大质的不同。