上篇(webRTC中音频相关的netEQ(三):存取包和延时计算)讲了语音包的存取以及网络延时和抖动缓冲延时的计算,MCU也收到了DSP模块发来的反馈报告。本文讲MCU模块如何根据网络延时、抖动缓冲延时和反馈报告等决定发给DSP模块的控制命令, 好让DSP模块先对取出的语音包做解码处理(如果有的话)以及根据这些命令做信号处理。

MCU模块给DSP模块发的控制命令主要有正常播放(normal)、加速播放(accelerate)、减速播放(preemptive expand)、丢包补偿(PLC,代码中叫expand)、融合(merge),还有些次要的,如解码器重新初始化(decoder re-init)、packet buffer 重置(packet buffer reset)等。这里讲主要的控制命令是怎么决策的,次要的相对简单就略去不讲了,有兴趣的可以自己去看相关代码。DSP模块收到这些命令后会转化为自己的处理命令,下表列出了主要的控制命令和处理命令的映射关系。

MCU模块给DSP模块发什么样的控制命令首先取决于当前帧和前一帧的接收情况。当前帧和前一帧的接收情况主要分以下四种(对当前帧和前一帧做排列组合得到四种情况):

1,当前帧和前一帧都接收正常,数据包会进入正常的解码流程。MCU模块会发正常播放、加速播放、减速播放三种控制命令中的一个给DSP,解码后的数据会根据命令做相应的处理。

2,当前帧接收正常,但前一帧丢失。如果前一帧丢失,但当前帧接收正常,说明前一帧是通过丢包补偿生成的。为了使前一帧由丢包补偿生成的数据和当前没有丢包的帧的数据保持语音连续,需要根据前后帧的相关性做平滑处理。这种情况下MCU模块会发正常播放、融合两种控制命令中的一个给DSP。DSP模块先对当前帧解码,然后解码后的数据会根据命令做相应的处理。

3,仅当前帧发生丢包或延迟,这时就不需要解码了。MCU模块会发丢包补偿命令给DSP,DSP模块会进入丢包补偿单元来生成补偿数据。

4,当前帧丢失或延迟,前一帧同样丢失或延迟。MCU模块会连续的发丢包补偿命令给DSP,DSP模块也会连续的进入丢包补偿单元来生成补偿数据。不过越到后面生成的补偿数据效果越差。

在上面的四种情况中,有些情况下MCU模块只会发一种命令给DSP模块,比如当前帧丢失,只会发丢包补偿控制命令给DSP。但有些情况下MCU模块可能会发几种命令中的一种给DSP模块,比如当前帧和前一帧都接收正常,MCU模块会发正常播放、加速播放、减速播放三种控制命令中的一个给DSP。到底发哪种命令呢,这就取决于网络延时、抖动缓冲延时以及DSP发给MCU的反馈报告等因素了。这是本文的重点,下面具体讲。

在DSP发给MCU的反馈报告中有个变量playedOutTS,它表示已经播放到的PCM数据的时间戳。同时MCU中还有个变量availableTS,它表示packet buffer中能获得的有效包的起始时间戳,显然如果availableTS等于0表示packet buffer为空。如果playedOutTS等于availableTS,它说明语音包正常接收;如果playedOutTS小于availableTS,它说明有语音包的丢失或者延时,需要做丢包补偿(PLC)。上篇文章(webRTC中音频相关的netEQ(三):存取包和延时计算)中讲了网络延时值(optBufLevel)和抖动缓冲延时值(buffLevelFilt)的计算,MCU就是要根据时间戳(playedOutTS & availableTS)的关系和延时(optBufLevel & buffLevelFilt)的关系以及上一帧的播放模式等来决定发什么样的控制命令给DSP。先举个简单的例子,如果playedOutTS = availableTS并且buffLevelFilt > optBufLevel,这说明当前包正常接收,但是抖动缓冲延时大于网络延时,即缓冲的包多了增加了时延,需要做加速播放处理,所以MCU会发加速处理命令给DSP。下面给出各个控制命令的条件,即满足所列条件时MCU就会发相应的控制命令给DSP。

1,正常播放控制命令 / 加速播放控制命令 / 减速播放控制命令的条件

正常播放控制命令为BUFSTATS_DO_NORMAL。加速播放控制命令为BUFSTATS_DO_ACCELERATE,加速播放的原因是要播放的数据正常到达,但是抖动缓冲延时大于网络延时,增加了时延,因此要加速播放。减速播放控制命令为BUFSTATS_DO_PREEMPTIVE_EXPAND,又称为优先扩展控制命令。减速播放的原因是要播放的数据正常到达,但是抖动缓冲延时小于网络延时,会引起播放时声音的断续,降低音质,因此要减速播放,拉长时间,使不会出现断续。这三种控制命令都有一个必要条件,那就是playedOutTS = availableTS, 所以把这三种控制命令放在一起讲。在“playedOutTS = availableTS”条件下,只有三种控制命令可供选择,要么正常播放,要么加速播放,要么减速播放。把加速播放和减速播放的条件搞清楚了,剩下的就是正常播放条件了。下图更直观的说明了正常播放、加速播放和减速播放的关系,去掉加速和减速的就是正常播放的了。

先看加速播放的条件。它的第二个条件是上一帧播放模式不为丢包补偿(第一个条件为playedOutTS = availableTS),第三个条件是下列两个之一:

1) 加速播放第三个条件之一

其中sample_rate为采样率,如8000/16000。samples_per_packet为每个包的采样点数,以16KHZ/每包20ms为例,samples_per_packet就为320。 timescaleHoldOff初始化为32,且每发生一次加速或减速播放就右移一位。此参数是为了防止连续的加速或减速播放恶化人耳的听觉感受。

2)加速播放第三个条件之二

再看减速播放的条件。它的第一个条件与第二个条件与加速播放一样,第三个条件如下:

说实话我没有完全理解上面三个加减速的数学表达式的判据,尤其是系数值的选取。我知道不能简单的认为“buffLevelFilt > optBufLevel"就加速“buffLevelFilt < optBufLevel"就减速,要真的这么判断的话效果肯定是不好的。如果哪位朋友理解了,麻烦给讲讲,先谢谢了!

除加减速播放这些条件外,剩下的就是正常播放了。可以写成如下的伪代码:

If(playedOutTS == availableTS)

{

If(上一帧播放模式不为丢包补偿)

{

If(加速播放第三个条件是下列之一 || 加速播放第三个条件是下列之二)

return 加速播放;

If(减速播放第三个条件)

return 减速播放;

}

return 正常播放;

}

2,丢包隐藏控制命令的条件

丢包隐藏控制命令为BUFSTATS_DO_EXPAND,又称为扩展控制命令。丢包隐藏的原因是要播放的包已丢失或者还没到(延时)。发生丢包隐藏的场景有:

1)availableTS = 0,即packet buffer为空,显然这时需要做丢包补偿。

2)playedOutTS < availableTS,即要播放的包丢失或者延时到,但是packet buffer里有缓冲包,需要满足下面两个条件之一即可:

a)  上一帧播放模式不为丢包补偿

b)  上一帧播放模式为丢包补偿,且前面几帧均为丢包补偿,这是连续丢包的场景,这时要看连续丢包补偿的次数。netEQ设定最多可以补偿100ms的数据,以每包20ms为例,最多可以补偿5个包,其实100ms后的补偿效果也不好了。所以连续丢包补偿的次数小于5的话,还会继续丢包补偿,否则就不做丢包补偿了。

3,融合控制命令的条件

融合控制命令为BUFSTATS_DO_MERGE,主要用于丢包隐藏后产生的PCM数据与从packet buffer里取出的数据的衔接过程。所以产生融合控制命令的条件是:

1)playedOutTS < availableTS (此式也表示packet buffer不为空,为空时availableTS = 0)

2)上一帧的处理模式为丢包补偿

以上就是主要的控制命令的条件。可能不同版本之间可能有差异,我是根据我用的版本来讲的。就像上面我说的,有些我也没有完全理解,只是把它照本宣科的讲出来。苦于没有文档呀,网上也没有相关的论述,目前只能先这样了,后面如果完全理解了再补充。

webRTC中音频相关的netEQ(四):控制命令决策的更多相关文章

  1. webRTC中音频相关的netEQ(五):DSP处理

    上篇(webRTC中音频相关的netEQ(四):控制命令决策)讲了MCU模块是怎么根据网络延时.抖动缓冲延时和反馈报告等来决定给DSP模块发什么控制命令的.DSP模块根据收到的命令进行相关处理,处理简 ...

  2. webRTC中音频相关的netEQ(三):存取包和延时计算

    上篇(webRTC中音频相关的netEQ(二):数据结构)讲了netEQ里主要的数据结构,为理解netEQ的机制打好了基础.本篇主要讲MCU中从网络上收到的RTP包是怎么放进packet buffer ...

  3. webRTC中音频相关的netEQ(二):数据结构

    上篇(webRTC中音频相关的netEQ(一):概述)是netEQ的概述,知道了它主要是用于解决网络延时抖动丢包等问题提高语音质量的,也知道了它有两大单元MCU和DSP组成.MCU 主要是把从网络收到 ...

  4. webRTC中音频相关的netEQ(一):概述

    上篇文章(语音通信中终端上的时延(latency)及减小方法)说从本篇开始会切入webRTC中的netEQ主题,netEQ是webRTC中音频技术方面的两大核心技术之一(另一核心技术是音频的前后处理, ...

  5. Sass控制命令及函数知识整理

    2017-07-07  20:17:17 最底部附结构图(实在是结构图太长了没办法) 2017-06-22  09:11:43 一.Sass的控制命令 1.@if语句 @if 指令是一个 SassSc ...

  6. Java 设计模式系列(十四)命令模式(Command)

    Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...

  7. Linux 视频设备驱动V4L2最常用的控制命令

    http://blog.csdn.net/shaolyh/article/details/6583226 Linux 视频设备驱动V4L2最常用的控制命令使用说明(1.02) 命令 功能 VIDIOC ...

  8. zookeeper命令行(zkCli.sh&zkServer.sh)使用及四字命令

    zookeeper提供了很多方便的功能,方便我们查看服务器的状态,增加,修改,删除数据(入口是zkServer.sh和zkCli.sh). 还提供了一系列四字命令,方便我们跟服务器进行各种交互,来确认 ...

  9. linux下监控进程需掌握的四个命令

    linux下监控进程需掌握的四个命令   在LInux系统下,最困难的工作之一就是跟踪正在系统中运行的程序,尤其是现在,图形桌面使用很多的程序,只是为了生成一个桌面环境,系统中运行了太多的进程,幸运的 ...

随机推荐

  1. C语言关键字分类整理

    C语言总览: 强类型,面向过程 简洁.灵活:32个关键字(C99标准新增5个,C11新增7个),9种控制语句,34种运算符 数据类型丰富,运算符丰富 结构化(控制语句).模块化(函数) 灵魂.特色:指 ...

  2. python中的 uuid 模块使用示例

    此模块提供不可变的 UUID 对象 (类 uuid) 和函数uuid1().uuid3().uuid4().uuid5(), 用于生成在 RFC 4122 中指定版本1.3.4和5UUIDs .如果你 ...

  3. Springboot 定时任务,service层无法注入问题详细解决

    开发一个微信小程序后台,建立websocket 长连接,需要后台开启定时任务, 定时任务定时查库,相应前台 但是具体执行过程中一直在报空指针错误,最后定位到service 为空,无法调用其相关的方法导 ...

  4. IceGrid 用于Python服务器和客户端通信——参数传递

    本篇介绍如何用IceGrid建立python多机通信,传递比较复杂的参数 Ice代码:Demo.ice #ifndef TOS_ICE_COMMON #define TOS_ICE_COMMON mo ...

  5. 2018-计算机系机试(第二批)-D-最小差值

    单点时限: 2.0 sec 内存限制: 256 MB 输入 n 个整数,输出最小差值.最小差值指所有数之间差的绝对值的最小数. 例如:3 个整数 1,2 和 6 的最小差值是 1. 输入格式 第一个数 ...

  6. JdbcTemplate 配置多数据源(完全照抄,完整)

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  7. yii2 rules 验证规则

    yii2  框架定义的约束 public $builtInValidators = [ 'boolean' => 'yii\validators\BooleanValidator', 'capt ...

  8. expdp用户10迁移到新环境11之正式实施

    expdp迁移源端数据库:cu    源端IP:   源端schema: xxx目标数据库:ora 目标IP:xxx操作流程:31日凌晨应用停,随后使用数据泵迁移,两套库迁移,迁移一套,迁移完毕应用确 ...

  9. 前端框架Angular、react、vue在github上的数据统计-2018-05

    2018年5月31日09:15:45 突然想看看几个前端框架的数量,然后就截图了如下数据: 分析: react关注.收藏.Fork都高vue一些, 但相差不大 angular比较奇葩,收藏只有二者一半 ...

  10. 联想Y410P在Ubuntu系统下开关机及插耳机破音“啪啪”的解决办法

    转载自:https://blog.csdn.net/YiKangJ/article/details/81239556 1.解决开关机“啪啪响”: options snd-hda-intel model ...