前两周刚刚更新了iOS15.4的系统,然后就发现了一个奇怪的问题,在iOS15.4的手机上安装音视频Demo,快速晃动时,远端看到的画面会卡顿,并且掉帧、帧率下降、不断变化,然而在其他系统手机上,却没有问题,所以是为什么?

1、难道是iOS15.4系统的采集修改,所以丢掉了部分帧?

2、难道是iOS15.4系统的硬编码修改,所以丢掉了部分帧?

3、难道是iOS15.4系统与WebRTC不匹配,所以WebRTC丢掉了部分帧?

根据这些猜想和疑问,在采集和编码处分别添加输出语句,测试多次发现:设置帧率15,快速晃动时,采集每秒输出15次,同一时间下编码每秒输出<15次,得出暂时的结论,出现丢帧、卡顿现象跟iOS15.4系统的采集、硬编码都没有关系,是采集的数据传到编码的时候,就有部分数据丢失了,那么只有可能是WebRTC遇到某种情况时,会进行丢帧处理,于是继续研究数据传输的代码。

果然,阅读数据传到编码之前的代码时,发现了一个丢帧处理的代码片段,代码如下:

Frame dropping is enabled iff frame dropping is not force-disabled, and rate controller is not trusted.(如果未强制禁用帧丢弃,且速率控制器不受信任,则启用帧丢弃。)

WebRTC默认情况下是不强制禁用帧丢弃,且速率控制器不受信任,所以会默认启用帧丢弃。然而force_disable_frame_dropper_(不强制禁用帧丢弃)这个值,WebRTC不具备更改此值的方法,需要自己添加,但是如果出现以下情况之一,则强制禁用帧拖放器:1、我们有分层的屏幕分享。或 2、“WebRTC FrameDropper”现场试验“已禁用”。

encoder_info_.has_trusted_rate_controller(速率控制器不受信任)这个值的设置,再研究研究。

既然知道是WebRTC主动进行帧丢弃处理,那么关于卡顿、丢帧的问题也就解决了,Happiness!

但是,是不是应该有这样一个疑问:为什么WebRTC要主动进行帧丢弃?什么条件下才会触发帧丢弃?正所谓:知其然而知其所以然。于是,继续分析触发帧丢失的条件。

首先看frame_dropper_.DropFrame()方法,

This function signals when to drop frames to the caller. It makes use of the drop_ratio_ to smooth out the drops over time.(此函数指示何时向调用者丢弃帧。它利用下降率来消除随时间的下降。)

此方法中主要是根据drop_ratio_.filtered()的值来进行处理的,所以进一步分析drop_ratio_.filtered(),其实这个就是下降率的过滤值,此值的变化,从而影响是否进行帧丢弃。而触发这个值的变化,是在上面提到的执行判断是否丢帧的地方之前,执行frame_dropper_.Leak(framerate_fps)

此方法,会根据目标码率和输入的帧率进行计算,然后再执行UpdateRatio(),更新下降率,从而更新drop_ratio_.filtered()值。通过输出和分析上面两个方法,发现target_bitrate_(目标码率)和accumulator_(叠加器)的变化会影响drop_ratio_.filtered()值的变化,从而影响是否丢帧的判断结果。继续分析这两个主要值的变化。

1、target_bitrate_(目标码率)此值的更改是根据网络质量估算,设置比较稳定的值

2、accumulator_(叠加器)此值的更改是有加有减

先执行void FrameDropper::Leak(uint32_t input_framerate)进行减法

再执行void FrameDropper::Fill(size_t framesize_bytes, bool delta_frame)进行加法

通过上面的计算后,进行if (accumulator_ > accumulator_max_)的判断,然后执行drop_ratio_.Apply()方法,更改filtered_的值。

至此,影响丢帧的判断就算基本分析清楚了。Perfect!

如果还有什么疑问,请留言,或者自行分析源码,相信你会有不一样的感觉。转载请注明出处,整理不易,谢谢。

WebRTC开发之iOS15.4快速晃动,远端观看卡顿掉帧问题相关推荐

  1. FreeBuds Pro 2开了空间音频效果不明显、卡顿、头部跟踪不灵敏或有延迟、音质差是怎么回事?

    效果不明显.卡顿.头部跟踪不灵敏或有延迟.音质差--.你的华为FreeBuds Pro 2开了空间音频会有这些小问题吗?该如何解决呢?一起来看看! | 及时更新耳机版本 新版本能修复一些小bug啥的, ...

  2. iOS开发之iOS15.6之后拉流LFLiveKit,画面模糊及16.1马赛克问题

    更新了iOS15.6系统后,发现拉取LFLiveKit进行直播的流,竟然是这样的: 模糊不清,于是思考是什么原因导致的. 1.是不是拉流端出现的问题? 使用安卓拉取iOS的直播流,是同样的效果,又考虑 ...

  3. WebRTC开发之webrtc/depot_tools/gn: line 8: exec: python: not found

    最近更新了Mac系统macOS Monterey和最新的Xcode13.3,然后发现webrtc无法编译了,出现了如下问题: 于是根据图片问题提示,打开gn文件,发现写的是"python&q ...

  4. iOS开发之iOS15及以上长按输入框点击文本识别,但识别界面不只是键盘区域,而是全屏的,并且会把键盘顶飞的bug解决

    正常情况下的实况文本,以微信举例,找一个输入框,长按会出现下图按钮(粘贴右边的), 点击这个按钮键盘会变成后置摄像头的内容,如下图 但不正常的情况是扫描页面会占满整个屏幕如下图 识别完之后,键盘显示异 ...

  5. Android快速开发之appBase——(4).详解com.snicesoft.Application和BaseActivity

    转载请注明本文出自JFlex的博客http://blog.csdn.net/jflex/article/details/46441571,请尊重他人的辛勤劳动成果,谢谢! Android快速开发之ap ...

  6. Android快速开发之appBase——(6).HttpReq和APICloudSDK

    转载请注明本文出自JFlex的博客http://blog.csdn.net/jflex/article/details/46462077,请尊重他人的辛勤劳动成果,谢谢! Android快速开发之ap ...

  7. Android快速开发之appBase——(5).BasePresenter的使用

    转载请注明本文出自JFlex的博客http://blog.csdn.net/jflex/article/details/46456621,请尊重他人的辛勤劳动成果,谢谢! Android快速开发之ap ...

  8. android idata 模式,Android快速开发之appBase——(3).详解IHolder和IData

    Android快速开发之appBase--(3).详解IHolder和IData IHolder和IData是AVLib的两个组件,在前面已经使用过了,那么这一篇将会详细说明这两个组件的用法. IHo ...

  9. 简单易懂的微前端开发之qiankun快速体验

    简单易懂的微前端开发之qiankun快速体验 微前端 问题 SingleSPA qiankun 快速体验 准备 开发 基座修改 子应用一修改 子应用二修改 运行结果 可能会遇到的问题 微前端 微前端就 ...

最新文章

  1. 提高工作效率,请收下这8个神器
  2. CentOS 7使用systemctl如何补全服务名称
  3. python fixture_python pytest进阶之xunit fixture详解
  4. 单臂路由与三层交换机—Vecloud微云
  5. FB/IB多代事务结构详解--对FB事务最好的讲解
  6. [Python学习] 专题二.条件语句和循环语句的基础知识
  7. 关于敏捷开发方法(Agile Software Development)的阅读笔记
  8. Google Guava EventBus和Java 7 WatchService用于事件编程
  9. C 语言实例 - 使用结构体(struct)
  10. SpringBoot2.0 整合 Shiro 框架,实现用户权限管理
  11. 数据结构与算法-笨办法解决问题1909
  12. 位置2的索引超出数组范围不能超过10_golang学习笔记--切片slice 与数组 arr
  13. OpenCV-Python实战(14)——人脸检测详解(仅需6行代码学会4种人脸检测方法)
  14. Dynamics CRM 2015Online Update1 new feature之 通过业务规则清空字段的值
  15. 关于cknife与burpsuite对java的版本需求的冲突机器解决办法
  16. 第四章 Python数据预处理之划分训练集与测试集
  17. JButton与Button的区别
  18. Python爬虫实战-小说网站爬虫开发
  19. 【源码阅读 | 03】only-allow 统一规范团队包管理器
  20. 手把手搭个vue的脚手架 - 2. 模板搭建

热门文章

  1. 网络安全-局域网内常见的攻击
  2. 起名~Java程序源码。
  3. 我们如何开始自我导向的第一步?
  4. windows 无法停止 Internet Connection Sharing (ICS)
  5. 相片怎么做音乐相册?这些方法帮助你搞定
  6. Android系统启动(二) — Zygote进程启动过程
  7. 天翼云盘快速下载解析源码
  8. 网站SEO恢复网站降权的七种方法
  9. 我是如何从测试开发做到年薪百万的
  10. 联想台式机天启M4500忘记BIOS密码