webrtc代码走读五(音频neteq代码走读)

一、概述

  • NetEqImpl类实现的功能有:

  1. 音频冗余报文解析
  2. nack报文请求
  3. 音频jitterbuffer
  4. 音频变速算法功能
  • 该类对外的关键接口有:

  1. NetEqImpl::InsertPacket:输入音频RTP报文
  2. NetEqImpl::GetAudio:音频渲染模块定时要音频报文
  3. 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帧数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值