一、概述
-
NetEqImpl类实现的功能有:
- 音频冗余报文解析
- nack报文请求
- 音频jitterbuffer
- 音频变速算法功能
-
该类对外的关键接口有:
- NetEqImpl::InsertPacket:输入音频RTP报文
- NetEqImpl::GetAudio:音频渲染模块定时要音频报文
- std::vector<uint16_t> GetNackList(int64_t round_trip_time_ms):输出需要nack重传的报文序列号
二、代码详解
-
NetEqImpl::InsertPacket
核心函数调用关系如下:
NetEqImpl::InsertPacket
->NetEqImpl::InsertPacketInternal
->PacketBuffer::InsertPacketList
->PacketBuffer::InsertPacket
->buffer_.insert(it, std::move(packet)); // Insert the packet at that position.
该函数的主要目的是把报文存储到PacketBuffer对象的buffer_中。
需要注意buffer_结构体的std::unique_ptr<AudioDecoder::EncodedAudioFrame> frame参数:
struct Packet {
struct Priority {
Priority() : codec_level(0), red_level(0) {}
Priority(int codec_level, int red_level)
: codec_level(codec_level), red_level(red_level) {
CheckInvariant();
}
//...
}
uint32_t timestamp;
uint16_t sequence_number;
uint8_t payload_type;
// Datagram excluding RTP header and header extension.
rtc::Buffer payload;
Priority priority;
RtpPacketInfo packet_info;
std::unique_ptr<TickTimer::Stopwatch> waiting_time;
std::unique_ptr<AudioDecoder::EncodedAudioFrame> frame;
//......
};
std::unique_ptr<AudioDecoder::EncodedAudioFrame> frame里面挂了解码器的句柄,就是说每个报文都指定了自己的解码器句柄。
收包入队函数里面,会调用:
std::unique_ptr<NackTracker> nack_:更新收包信息,便于确定需要nack重传的报文。
std::unique_ptr<StatisticsCalculator> stats_:更新报文之间时间间隔,用于确定jitterbuffer缓存时间。
-
NetEqImpl::GetAudio
关键函数处理说明:
NetEqImpl::ExtractPackets:获取RTP报文,待解码
packet_list->front().frame->Decode进行音频解码
封装输出音频PCM帧数据。