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

可以以发送一帧视频数据的时间为依据,判断当前网络拥塞情况。
    网络中出现丢包和抖动,导致接收端接收数据超时,会激发发送端数据重传,重传机制本身挤占网络带宽,导致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. OpenGL学习--05--纹理立方体--BMP文件格式详解(转载)

    http://blog.csdn.net/o_sun_o/article/details/8351037 BMP文件格式详解 BMP文件格式详解(BMP file format) BMP文件格式,又称 ...

  2. Android开发时,那些相见恨晚的工具或网站!

    本文来我在知乎话题Android开发时你遇到过什么相见恨晚的工具或网站?下的回答! 在实际Android开发过程确实会有很多相见恨晚的工具或网站出现,下面是我自己的一些分享. 1.源码网站 https ...

  3. 重装系统,打开VS进行程序调试运行的时候 Unable to find manifest signing certificate in the certificate store

    重装系统,打开VS进行程序调试运行的时候 Unable to find manifest signing certificate in the certificate store. 项目的属性-> ...

  4. linux rpm之已安装包校验、rpm包中文件提取

    已安装包校验 rpm -V 已安装的包名-V 校验指定rpm包中的文件 rpm -V pth没有任何提示,说明自安装后没有做过任何修改 rpm包中文件提取 比如对一个系统配置文件误操作,可以根据这个文 ...

  5. vuejs code splitting with webpack 3种模式

    我们知道一个web app如果太大会严重影响用户的体验,如何能够最快速度地让用户看到完整页面是优化web应用需要做的重要工作. 这其中使用code split实现lazy加载,只让用户初次访问时只加载 ...

  6. javascript promise编程

    在loop中使用promise: https://stackoverflow.com/questions/17217736/while-loop-with-promises

  7. DES加密(支持ARC与MRC)

    DES加密(支持ARC与MRC) 源文件: YXCrypto.h 与 YXCrypto.m // // YXCrypto.h // 用秘钥给字符串加密或者解密 // // Created by You ...

  8. 使用CAReplicatorLayer [1]

    使用CAReplicatorLayer [1] 说明 https://developer.apple.com/library/ios/documentation/GraphicsImaging/Ref ...

  9. [转]SQL Server 数据库定时自动备份

    前提:在使用下面的备份方式之前需要确保你的Sqlserver Agent服务启动,切设置为自动启动.否则当你服务器重启了但是Agent服务没有启动,那么自动备份任务就不会执行 (一)使用TSql代码自 ...

  10. November 23rd 2016 Week 48th Wednesday

    I always like walking in the rain, so no one can see me crying. 我一直喜欢在雨中行走,那样就没人能看到我的眼泪. I like walk ...