WebRTC Audio NetEQ学习笔记

一 DelayManager有一个直方图Histogram,统计(时间戳差,IAT延时),获得延时的值。

double quantile = 0.97;
double forget_factor = 0.9993;

int Histogram::Quantile(int probability)中,统计buckets_[index]值<=quantile,返回index。

打日志看了,index大部分都是0。

buckets_初始化200,有些文章个数是0-64,应该是新版本改了。

二 DelayManager:计算接收音频包的延时。

TargetDelayMs(),target_level_ms_。

最大个数max_packets_in_buffer_ = 200。

DelayManager::Update{
...
UpdateDelayHistory(iat_delay_ms, timestamp, sample_rate_hz);
relative_delay = CalculateRelativePacketArrivalDelay();
...
}

三 BufferLevelFilter

buffer_level_filter_->filtered_current_level();

SetTargetBufferLevel:根据延时计算level_factor_。level_factor_会影响filtered_current_level_值的计算。

四 决策逻辑DecisionLogic:采取那种方式播放音频。

如正常Normal、融合Merge、补偿Expand--PLC、减速PreemptiveExpand、加速Accelerate。

采用变速不变调的方法,实现的类TimeStretch。

五 NetEqImpl 

class NetEqImpl : public webrtc::NetEq {
std::unique_ptr algorithm_buffer_; //算法缓冲区
std::unique_ptr sync_buffer_; //算法缓冲区的数据复制,有已播放位置标识
const std::unique_ptr packet_buffer_;//接收网络的音频包
std::unique_ptr decoded_buffer_;
std::unique_ptr controller_; //调用DecisionLogic
}

decoded_buffer_给操作如Normal等,输出algorithm_buffer_。algorithm_buffer_又插入到sync_buffer_。

syncable_audio_->SetMinimumPlayoutDelay(target_audio_delay_ms)

最终调用DelayManager::SetMinimumDelay。

你可能感兴趣的:(webrtc,webrtc)