Catalog
  1. 1. 概要
  2. 2. 初始化比特率的过程
webrtc是如何设置编码器比特率的

概要

本文所涉及的代码均采自 4147 (m84) 分支。基于此分支,分析 webrtc 是如何设置 opus 编码器的比特率的。做这个事情的原因是希望找到一个降低流量的方案,目前能想到的是降低编码器的比特率来达成目标。

初始化比特率的过程

  1. 设置及计算编码器相关参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // 此方法解析 sdp,并提取其中的数值进行初始化
    AudioEncoderOpusImpl::SdpToConfig
    // 省略部分代码
    ...

    // 根据参数计算出预计的比特率, max_playback_rate 是对端选用的播放时钟速率,也就是 8K, 16K, 48K 等等。这个字段值由 sdp 中的 maxplaybackrate 体现。默认 48K 的播放速率下,比特率是 32000。
    int CalculateDefaultBitrate(int max_playback_rate, size_t num_channels) {
    const int bitrate = [&] {
    if (max_playback_rate <= 8000) {
    return kOpusBitrateNbBps * rtc::dchecked_cast<int>(num_channels);
    } else if (max_playback_rate <= 16000) {
    return kOpusBitrateWbBps * rtc::dchecked_cast<int>(num_channels);
    } else {
    return kOpusBitrateFbBps * rtc::dchecked_cast<int>(num_channels);
    }
    }();
    RTC_DCHECK_GE(bitrate, AudioEncoderOpusConfig::kMinBitrateBps);
    RTC_DCHECK_LE(bitrate, AudioEncoderOpusConfig::kMaxBitrateBps);
    return bitrate;
    }
  2. 初始化 opus 编码器比特率

    1
    2
    3
    4
    5
    6
    // 初始化编码器时调用的方法
    AudioEncoderOpusImpl::RecreateEncoderInstance
    // 省略部分代码
    ...
    // 调用 opus api 设置 bitrate
    RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, bitrate));

所以可以通过 sdp 中的 max_playback_rate(8000, 16000, 大于 16000) 来设置比特率。如上代码所示,比特率对应有 12000, 20000, 32000 等等。依据所选的比特率,最终编码后的数据比特率与其值基本保持一致。如果 max_playback_rate 设置为 8000, 那么比特率会被设置为 12000。通过抓包分析,每个包(60ms)的长度约 90 bytes, 比特率在12000 左右。加上 udp 包头约 40 字节,那么最终的比特率在 17000(2K+) 左右。并且经观察,cpu 没有明显的上扬。所以如果需要将流量的,可以采取此方案。

1
2
3
4
5
6
7
8
18:56:57.180823 IP 192.168.94.78.59559 > 192.168.94.81.44591: UDP, length 93
18:56:57.243375 IP 192.168.94.78.59559 > 192.168.94.81.44591: UDP, length 93
18:56:57.305195 IP 192.168.94.78.59559 > 192.168.94.81.44591: UDP, length 98
18:56:57.370046 IP 192.168.94.78.59559 > 192.168.94.81.44591: UDP, length 92
18:56:57.420877 IP 192.168.94.78.59559 > 192.168.94.81.44591: UDP, length 98
18:56:57.487365 IP 192.168.94.78.59559 > 192.168.94.81.44591: UDP, length 95
18:56:57.542928 IP 192.168.94.78.59559 > 192.168.94.81.44591: UDP, length 91
18:56:57.603545 IP 192.168.94.78.59559 > 192.168.94.81.44591: UDP, length 96
Author: 42
Link: http://blog.ikernel.cn/2020/11/18/webrtc%E6%98%AF%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E7%BC%96%E7%A0%81%E5%99%A8%E6%AF%94%E7%89%B9%E7%8E%87%E7%9A%84/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.

Comment