本篇文章的丢帧是依据编码后的码率和目标码率来决定丢帧,
而下一篇文章介绍的丢帧依据是目标帧率。
由此可对丢帧策略分类如下:
- 编码后的码率和目标码率来决定丢帧
- 目标帧率决定丢帧
在实时流媒体系统中,jitterbuffer是在解码端,起到如下几个作用:
对于1,2点比较简单。核心的是去抖动,去抖动实现的目标就是使视频能平滑播放,不因为抖动忽快忽慢。
简单的视频jitterbuffer可以只针对rtp包进行处理,只对rtp进行排序,去重。并不处理视频帧。如下图
这种简单的实现并不关心视频帧是否有错,是否可以解码。视频帧间是否可以持续解码。(针对视频帧内的RTP包,如果经过排序和去重,可以认为是可解码的)。这些全部放在解码模块去做。
当然这种形式的Jitterbuffer无法处理抖动。因为对视频帧而言,抖动的处理是针对帧间的,而不是RTP包间的。把它叫做rtp buffer应该更合适些。
webrtc中的jitterBuffer也是QOS机制中的核心,它会估算抖动,丢包,决定是否通过Nack来重传。这里我先忽略与QOS相关的一些逻辑,先看看jitterBuffer中的一些核心的基础功能。
webrtc中的jitterBuffer是基于视频帧实现,在RTP的接收端存入jitterbuffer的是rtp包,在解码端取出的是视频帧。
本系列介绍Webrtc的agc算法。webrtc的agc算法对各种情况作了较为详尽的考虑,而且使用了的定点数的方法来实现,因此内容比较多。尽量在这几篇文章中描述清楚。
一、WebRtcAgc_AddMic
WebRtcAgc_AddMic用在自适应模拟模式下(kAdaptiveAnalog),其流程如下:
一、AGC的三个流程
函数 调用 功能
ProcessRenderAudio 远端输出前 调用AGC的WebRtcAgc_AddFarend
AnalyzeCaptureAudio 近端高通滤波器后 根据模式,可变模拟(kAdaptiveAnalog)调用WebRtcAgc_AddMic,可变模拟(kAdaptiveDigital)调用WebRtcAgc_VirtualMic
ProcessCaptureAudio 近端VAD后输出前 调用AGC的WebRtcAgc_Process
这三个流程是AGC的主要接口。下面将会对这些三个流程进行详细的介绍。
本系列介绍Webrtc的agc算法。webrtc的agc算法对各种情况作了较为详尽的考虑,而且使用了的定点数的方法来实现,因此内容比较多。尽量再这几篇文章中描述清楚。
一、AGC模块的结构与简介
较新的webrtc已经把原来的agc模块移动到了一个叫做legacy的文件夹。这个回头再写文章详细介绍。我还是从旧的agc算法开始讲起。Webrtc 的AGC算法的结构如下
|–\include |–gain_control.h
agc—|–analog_agc.c
|–analog_agc.h
|–digital_agc.c
|–digital_agc.h
音频方面的开源项目很多很多。
最知名的莫过于谷歌开源的WebRTC,
其中的音频模块就包含有
AGC自动增益补偿(Automatic Gain Control)
自动调麦克风的收音量,使与会者收到一定的音量水平,不会因发言者与麦克风的距离改变时,声音有忽大忽小声的缺点。
ANS背景噪音抑制(Automatic Noise Suppression)
探测出背景固定频率的杂音并消除背景噪音。
AEC是回声消除器(Acoustic Echo Canceller)
对扬声器信号与由它产生的多路径回声的相关性为基础,建立远端信号的语音模型,利用它对回声进行估计,并不断地修改滤波器的系数,使得估计值更加逼近真实的回声。然后,将回声估计值从话筒的输入信号中减去,从而达到消除回声的目的,AEC还将话筒的输入与扬声器过去的值相比较,从而消除延长延迟的多次反射的声学回声。根椐存储器存放的过去的扬声器的输出值的多少,AEC可以消除各种延迟的回声。
人们所熟知的图像方面的3A算法有:
AF自动对焦(Automatic Focus)
自动对焦即调节摄像头焦距自动得到清晰的图像的过程
AE自动曝光(Automatic Exposure)
自动曝光的是为了使感光器件获得合适的曝光量
AW自动白平衡(Automatic White Balance)
白平衡的本质是使白色物体在任何光源下都显示白色
与之相对应的音频方面的3A算法是:
AGC自动增益补偿(Automatic Gain Control)
自动调麦克风的收音量,使与会者收到一定的音量水平,不会因发言者与麦克风的距离改变时,声音有忽大忽小声的缺点。
ANS背景噪音抑制(Automatic Noise Suppression)
探测出背景固定频率的杂音并消除背景噪音。
AEC是回声消除器(Acoustic Echo Canceller)
对扬声器信号与由它产生的多路径回声的相关性为基础,建立远端信号的语音模型,利用它对回声进行估计,并不断地修改滤波器的系数,使得估计值更加逼近真实的回声。然后,将回声估计值从话筒的输入信号中减去,从而达到消除回声的目的,AEC还将话筒的输入与扬声器过去的值相比较,从而消除延长延迟的多次反射的声学回声。根椐存储器存放的过去的扬声器的输出值的多少,AEC可以消除各种延迟的回声。
图像方面的算法就不多说了,图像方面的3a算法,本人都实现了。
自动白平衡的主要思路,就是如何判断图像是否偏色,偏色后如何修复的问题。
常见的有直方图均衡,自动对比度,自动色阶等等。
自动曝光也是要做曝光评估,常见的有gama调节等等。
后续有时间,再陆续贴出相应的代码。
主要用于评估一定长度音频的音量强度,
而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法。
不过在项目实测的时候,其实真的很难定标准,
到底在什么样的环境下,要增大音量,还是降低。
在通讯行业一般的做法就是采用静音检测,
一旦检测为静音或者噪音,则不做处理,反之通过一定的策略进行处理。
这里就涉及到两个算法,一个是静音检测,一个是音频增益。
增益其实没什么好说的,类似于数据归一化拉伸的做法。
静音检测 在WebRTC中 是采用计算GMM (Gaussian Mixture Model,高斯混合模型)进行特征提取的。
在很长一段时间里面,音频特征 有3个主要的方法,
GMM ,Spectrogram (声谱图), MFCC 即 Mel-Frequency Cepstrum(Mel频率倒谱)
恕我直言,GMM 提取的特征,其鲁棒性 不如后两者。
也不多做介绍,感兴趣的同学,翻翻 维基百科 ,补补课。
当然在实际使用算法时,会由此延伸出来一些小技巧。
例如,用静音检测 来做音频裁剪,或者搭配音频增益做一些音频增强之类的操作。