WebRTC音视频之优化音频造成的内存增长和增加大小流

1、关于多人通话内存不断增长的问题

 

在旧版本iPhone上(比如:iPhone6、6s、7),四人及以上通话,造成内存不断增长,使用Instrument工具分析,是因为audioFrame创建过快,再加上人数过多以后,CPU处理能力跟不上,释放audioFrame对象逐渐变慢,造成内存逐步上涨,后来查看了线程等级和使用位置,进行了调整,将原来的AudioEncoder线程的等级从NORMAL提高到了HIGH,视图如下:

 其实也可以通过修改其他两个关于video和stream的线程等级达到效果,但是会造成视频画面卡顿,效果不太理想,所以相对于来说,改audio的比较合适。

2、关于video大小流的分辨率更改问题

为了适配多人通话,所以将视频流分成了大小流,即高清晰度和低清晰度,比如场景:设置开启双流的开关,默认订阅远端视频流的小流,当需要清楚查看远端某个人的视频时,可以将此人切换至大流,在具体情况下使用,可以有效的优化多人视频,减少多人会话时的资源消耗。

webrtc_video_engine.cc

std::vector<webrtc::VideoStream> EncoderStreamFactory::CreateEncoderStreams(
    int width,
    int height,
    const webrtc::VideoEncoderConfig& encoder_config) {
  RTC_DCHECK_GT(encoder_config.number_of_streams, 0);
  RTC_DCHECK_GE(encoder_config.simulcast_layers.size(),
                encoder_config.number_of_streams);
  std::vector<webrtc::VideoStream> layers;

  const absl::optional<webrtc::DataRate> experimental_min_bitrate =
      GetExperimentalMinVideoBitrate(encoder_config.codec_type);

  if (encoder_config.number_of_streams > 1 ||
      ((absl::EqualsIgnoreCase(codec_name_, kVp8CodecName) ||
        absl::EqualsIgnoreCase(codec_name_, kH264CodecName)) &&
       is_screenshare_ && conference_mode_)) {
    const bool temporal_layers_supported =
        absl::EqualsIgnoreCase(codec_name_, kVp8CodecName) ||
        absl::EqualsIgnoreCase(codec_name_, kH264CodecName);
    // Use legacy simulcast screenshare if conference mode is explicitly enabled
    // or use the regular simulcast configuration path which is generic.
    layers = GetSimulcastConfig(encoder_config.number_of_streams, width, height,
                                encoder_config.bitrate_priority, max_qp_,
                                is_screenshare_ && conference_mode_,
                                temporal_layers_supported);
    //屏幕共享只保留大流    
    if(is_screenshare_ && layers.size() == 2) {
       layers.pop_back();
    }

    // Allow an experiment to override the minimum bitrate for the lowest
    // spatial layer. The experiment's configuration has the lowest priority.
    if (experimental_min_bitrate) {
      layers[0].min_bitrate_bps =
          rtc::saturated_cast<int>(experimental_min_bitrate->bps());
    }
    // The maximum |max_framerate| is currentl
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hbblzjy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值