一、如何判断当前的网络状况

可以以发送一帧视频数据的时间为依据,判断当前网络拥塞情况。
    网络中出现丢包和抖动,导致接收端接收数据超时,会激发发送端数据重传,重传机制本身挤占网络带宽,导致sendbuffer中的数据进一步发送失败,致使sendbuffer中的数据不断增多,达到上溢的警戒线,此时应用层函数下发数据到sendbuffer就不会瞬间完成,而是会等待sendbuffer中的数据低于警戒线,再将数据下发。因此可以根据应用层函数写数据到sendbuffer的时间来判断网络的拥塞情况。
    可以实时监控直播网络状况,当网络带宽变差时,推流端会迅速地逐级降低视频的帧率、码率、分辨率,以保证推流视频的流畅。而当网络恢复良好时,在确保流畅的前提下,推流端会逐渐提升视频的帧率、码率、分辨率,提升直播视频的清晰度。

二、弱网情况下的一些优化

1. 根据网络状况动态调整视频的帧率、分辨率,使占用的网络带宽更低;
2. 当网络状况不好时,选择性的丢弃参考帧(不丢I帧和音频帧);
3. 选择更高编码压缩率的编码格式(如H.265)。

三、推流端自适应码率

直播推流端实时根据主播所处的网络环境,调整主播的视频码率。在推流过程中,我们可以根据当时主播的网络状况,测算出网络出口带宽是多少,进而和编码器产生的数据量进行比较:如果网络出口带宽大于编码器产生的数据量,则可以提高视频质量(增大编码器的码率设置,同时增大视频的fps以达到更加流畅的效果);如果网络出口带宽和编码器产生的数据量相近,那么视频质量可不做任何改变;如果小于,那就要降低视频质量,以使得主播可以流畅的进行直播。由于整个流的码率中视频轨码率达90%以上,所以只处理视频一般就能满足大部分场景。

1. 网络带宽监测模块

网络上行带宽成为发送码率,编码器编码出来的码率成为压缩码率。实际的监测过程应该是一个窗口时间段的平均码率(一般为3~10s)。

2. 码率调整策略

我们的目的就是按照发送码率反馈给编码器来调整压缩码率。一般会使用几个窗口时间长度的发送平均码率去设置知道编码器改变码率。但是这种策略只能作为将码率的条件,因为这种统计方式统计出来的发送码率不可能会大于压缩码率。因此,如果想要做到升码率,就需要在策略中加上当前H264队列大小的变化趋势,比如队列大小哦啊一直在0和1之间进行变化,则代表编码器编码出来的视频帧,Publisher模块就立马将他发送出去,这时我们就可以尝试去上升码率;比如如果队列编码趋势在队列大小的10%~70%范围内徘徊,则代表有网络抖动发生,可以暂时不做处理(也就是说升码率同时也要看当前视频buffer的大小)。

3. 实时改变编码器的码率

ios和android的硬解分别有相应的接口可以实时改变码率。而FFmpeg的libx264可以通过x264_encoder_reconfig函数实时改变码率。

总结,对于直播场景,采用qos策略,动态调整编码参数,包括帧率,码率,分辨率,缓冲区。当直播出现卡顿,采用快降慢升的策略,当网络波动比较厉害,这样可以避免编码参数频繁的来回调整,造成恶性循环。当进行编码参数调整时,一般是根据分辨率把码率,帧率分成几个档次,然后在根据一定时间段内的统计数据,在这几组参数集合之间进行来回切换,确保音视频流畅的同时,尽量提高图像质量。

五、GOP(Group of pictures)

GOP的长度就是指2个I帧之间的帧数(通常也称为“关键帧间隔”)。
    GOP 长度越小,直播内容延时越小,GOP 长度越大,直播内容延时越大;
    GOP 越长,越有利于减少视频码率,降低其所需要消耗的存储和带宽。

六、播放体验

两个问题:

1. 至少一个 GOP 的直播内容延时不可避免;
    2. 如果 GOP 尚未生成完毕时进行播放,会遇到黑屏(或是花屏)。
    针对第一个问题,其实很好解决,推流端编码器或直播服务器将 GOP 长度设置的足够低(比如 0.5s 或是 1s, 不影响编码画质的前提下),播放画面与现场画面的时间差将会越低。
    针对第二个问题,单纯修改播放器业务逻辑也解决不了问题。有一种办法是即修改直播服务器,也修改客户端播放器行为逻辑,实现 “双 I 帧交替秒开优化”。

七、双 I 帧交替秒开优化

修改直播服务器由缓存一个 GOP 为缓存一个 I 帧,快速下发给播放器;
    修改客户端播放器行为,当遇到一个 I 帧后立即渲染显示,达到秒开,并且是“首帧秒开”;
    为了防止时间差内首次播放请求没有遇到 I 帧播放会出现花屏,直播服务器与客户端播放器建立连接后,将缓存的 I 帧快速下发,将第二个 I 帧之前的非 I 帧全部丢弃,直到第二个 I 帧之后传输正常的 GOP。这样,通过 “双 I 帧交替秒开优化”,即可以减少一个 GOP 的直播内容延时,又可以避免黑屏或花屏达到播放请求一次性秒开。

视频直播时的QoS策略的更多相关文章

  1. 【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1277 视频直 ...

  2. 【腾讯Bugly干货分享】H5 视频直播那些事

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a42ee6503dfcb22007ede8 Dev Club 是一个交流移动 ...

  3. H5 视频直播相关技术

    一.移动视频直播发展 大家首先来看下面这张图: 可以看到,直播从 PC 到一直发展到移动端,越来越多的直播类 App 上线,同时移动直播进入了前所未有的爆发阶段,但是对于大多数移动直播来说,还是要以 ...

  4. H5视频直播扫盲

    H5视频直播扫盲 2016-05-25 • 前端杂项 • 14 条评论 • lvming19901227 视频直播这么火,再不学就out了. 为了紧跟潮流,本文将向大家介绍一下视频直播中的基本流程和主 ...

  5. IOS 视频直播/智能家居(一行行敲代码,从零开始)lesson:1整体架构

    本文转载至 http://blog.csdn.net/u014011807/article/details/47144027 前段时间由于工作需要做了一个视频直播/智能家居类的应用.算是对iOS音视频 ...

  6. 利用Nginx搭建RTMP视频直播,点播服务器,ffmpeg推流,回看

        一.环境和工具 ubuntu 14.04 desktop 不用server的原因是一部分的演示用到了linux视频播放和直播软件,自己还要装桌面,麻烦. 不建议使用 最新的16TLS,我一开始 ...

  7. QQ视频直播架构及原理 流畅与低延迟之间做平衡 音画如何做同步?

    QQ视频直播架构及原理 - tianyu的专栏 - CSDN博客 https://blog.csdn.net/wishfly/article/details/53035342 作者:王宇(腾讯音视频高 ...

  8. HTML5 视频直播

    目前视频直播,尤其是移动端的视频直播已经火到不行了,基本上各大互联网公司都有了自己的直播产品,所以对于直播的一些基本知识和主要技术点也要有所了解,本次分享就向大家介绍一下其中的奥秘. 内容大体框架:  ...

  9. 视频直播技术-视频-编码-传输-秒开等<转>

    转载地址:http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=2653547042&idx=1&sn=26d8728548 ...

随机推荐

  1. Ubuntu14.04安装Torch7笔记

    Ubuntu14.04安装Torch7笔记 利用快捷键Ctrl+Alt+T打开Ubuntu终端 第一步: 获取安装LuauJIT(C语言编写的Lua的解释器)和Torch所必需的依赖包. 代码如下: ...

  2. 模拟时钟(AnalogClock)

    模拟时钟(AnalogClock) 显示一个带时钟和分针的表面 会随着时间的推移变化 常用属性: android:dial 可以为表面提供一个自定义的图片 下面我们直接看代码: 1.Activity ...

  3. adb调试桥(5037端口)

    path里添加路径:../platform 查看设备 adb devices 杀死adb:adb kill -server 启动adb:adb start- server adb不能启动解决办法: 1 ...

  4. android控件TextView之 分段显示不同颜色

    代码如下: attrs.xml文件: 第二种方式: String newMessageInfo = "<font color='red'><b>" + 红色 ...

  5. JS数组与对象的遍历方法大全

    本文简单解析各种数组和对象属性的遍历方法: 原生for循环.for-in及forEach ES6 for-of方法遍历类数组集合 Object.key()返回键名的集合 jQuery的$.each() ...

  6. python-threading.Event实现事件功能--汽车过红绿灯(转载)

    python-threading.Event实现事件功能 enent可以通过设置.等待.清除一个标识(flag),来进行线程间的控制线程可以通过获取这个标志位(flag)的状态(设置或未设置)来控制线 ...

  7. EF实体对象解耦 - 泛型联表查询

    为了达到模块间最小耦合,单模块业务数据不与其他模块发生关系.在操作数据库的时候,采用EF泛型操作.但泛型操作不好实现联表,经过一晚的试验发现了一种定义数据库上下文并联表的方式. 1.实体对象定义.实体 ...

  8. 查看windows所有exe的启动参数。

    在cmd中输入 wmicprocess 即可查看到所有进程的启动参数和运行参数.

  9. [控件] BookTextView

    BookTextView 效果 说明 1. 支持富文本 2. 支持自定义view 3. 支持阅读百分比 源码 https://github.com/YouXianMing/UI-Component-C ...

  10. [UI] 精美UI界面欣赏[4]

    精美UI界面欣赏[4]