热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

直播技术:如何实现1080P延迟低于500ms的实时超清直播传输技术

若该文为原创文章,未经允许不得转载原博主博客地址:https:blog.csdn.netqq21497936原博主博客导航:https:b

若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/106117514
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

 


导语

视频直播是很多技术团队及架构师关注的问题,在实时性方面,大部分直播是准实时的,存在 1-3 秒延迟。本文由袁荣喜向「高可用架构」投稿,介绍其将直播延迟控制在 500ms 的背后的实现。

 


前言

最近由于公司业务关系,需要一个在公网上能实时互动超清视频的架构和技术方案。众所周知,视频直播用 CDN + RTMP 就可以满足绝大部分视频直播业务,我们也接触了和测试了几家 CDN 提供的方案,单人直播没有问题,一旦涉及到多人互动延迟非常大,无法进行正常的互动交谈。对于我们做在线教育的企业来说没有互动的直播是毫无意义的,所以我们决定自己来构建一个超清晰(1080P)实时视频的传输方案。

先来解释下什么是实时视频,实时视频就是视频图像从产生到消费完成整个过程人感觉不到延迟,只要符合这个要求的视频业务都可以称为实时视频。关于视频的实时性归纳为三个等级:


  • 伪实时:视频消费延迟超过 3 秒,单向观看实时,通用架构是 CDN + RTMP + HLS,现在基本上所有的直播都是这类技术。
  • 准实时: 视频消费延迟 1 ~ 3 秒,能进行双方互动但互动有障碍。有些直播网站通过 TCP/UDP + FLV 已经实现了这类技术,YY 直播属于这类技术。
  • 真实时&#xff1a;视频消费延迟 <1秒&#xff0c;平均 500 毫秒。这类技术是真正的实时技术&#xff0c;人和人交谈没有明显延迟感。QQ、微信、Skype 和 WebRTC 等都已经实现了这类技术。

0?wx_fmt&#61;png

从上图可以看出&#xff0c;如果网络控制在环路延迟在 200ms 丢包在 10% 以下&#xff0c;可以让视频延迟在 500ms 毫秒以下&#xff0c;这并不是一个对网络质量要求很苛刻的条件。所以我们在后台的媒体服务部署时&#xff0c;尽量让客户端到媒体服务器之间的网络满足这个条件&#xff0c;如果网路环路延迟在 300ms 丢包 15% 时&#xff0c;依然可以做到小于 1 秒的延迟&#xff0c;基本能满足双向互动交流。


公网测试

公网测试相对比较简单&#xff0c;我们将 Server 部署到 UCloud 云上&#xff0c;发送端用的是上海电信 100M 公司宽带&#xff0c;接收端用的是河北联通 20M 小区宽带&#xff0c;环路延迟在 60ms 左右。总体测试下来 1080P 在接收端观看视频流畅自然&#xff0c;无抖动&#xff0c;无卡顿&#xff0c;延迟统计平均在 180ms 左右。

 


入坑

在整个 1080P 超清视频的传输技术实现过程中&#xff0c;我们遇到过比较多的坑。大致如下&#xff1a;


Socket 缓冲区问题

我们前期开发阶段都是使用 socket 默认的缓冲区大小&#xff0c;由于 1080P 图像帧的数据非常巨大&#xff08;关键帧超过 80KB&#xff09;&#xff0c;我们发现在在内网测试没有设置丢包的网络环境发现接收端有严重的丢包&#xff0c;经查证是 socket 收发缓冲区太小造成丢包的&#xff0c;后来我们把 socket 缓冲区设置到 128KB 大小&#xff0c;问题解决了。


H.264 B 帧延迟问题

前期我们为了节省传输带宽和防丢包开了 B 帧编码&#xff0c;由于 B 帧是前后双向预测编码的&#xff0c;会在编码期滞后几个帧间隔时间&#xff0c;引起了超过 100ms 的编码延时&#xff0c;后来我们为了实时性干脆把 B 帧编码选项去掉。


Push 方式丢包重传

在设计阶段我们曾经使用发送端主动 push 方式来解决丢包重传问题&#xff0c;在测试过程发现在丢包频繁发生的情况下至少增加了 20% 的带宽消耗&#xff0c;而且容易带来延迟和网络拥塞。后来几经论证用现在的 pull 模式来进行丢包重传。


Segment 内存问题

在设计阶段我们对每个视频缓冲区中的帧信息都是动态分配内存对象的&#xff0c;由于 1080P 在传输过程中每秒会发送 400 - 500 个 UDP 报文&#xff0c;在 PC 端长时间运行容易出现内存碎片&#xff0c;在服务器端出现莫名其妙的 clib 假内存泄露和并发问题。我们实现了一个 memory slab 管理频繁申请和释放内存的问题。


音频和视频数据传输问题

在早期的设计之中我们借鉴了 FLV 的方式将音频和视频数据用同一套传输算法传输&#xff0c;好处就是容易实现&#xff0c;但在网络波动的情况下容易引起声音卡顿&#xff0c;也无法根据音频的特性优化传输。后来我们把音频独立出来&#xff0c;针对音频的特性设计了一套低延迟高质量的音频传输体系&#xff0c;定点对音频进行传输优化。

后续的工作是重点放在媒体器多点分布、多点并发传输、P2P 分发算法的探索上&#xff0c;尽量减少延迟和服务带宽成本,让传输变的更高效和更低廉。


Q&A


提问&#xff1a;在优化到 500ms 方案中&#xff0c;哪一块是最关键的&#xff1f;

袁荣喜&#xff1a;主要是丢包重传 拥塞和播放缓冲这三者之间的协调工作最为关键&#xff0c;要兼顾延迟控制和视频流畅性。


提问&#xff1a;多方视频和单方有哪些区别&#xff0c;用到了 CDN 推流吗&#xff1f;

袁荣喜&#xff1a;我们公司是做在线教育的&#xff0c;很多场景需要老师和学生交谈&#xff0c;用 CDN 推流方式延迟很大&#xff0c;我们这个视频主要是解决多方通信之间交谈延迟的问题。我们现在观看放也有用 CDN 推流&#xff0c;但只是单纯的观看。我们也在研发基于 UDP 的观看端分发协议&#xff0c;目前这部分工作还没有完成。

 


参考阅读


  • 移动直播技术秒开优化经验&#xff08;含PPT&#xff09;

  • 揭秘百万人围观的Facebook视频直播

技术原创文章&#xff0c;欢迎通过公众号菜单「联系我们」进行投稿。投稿方向包括技术架构类文章、新技术及新实践、通过的文章会在高可用架构公众号、微博、今日头条等多个媒体发表。投稿需同意相关文章在高可用架构首发。转载请注明来自高可用架构「ArchNotes」微信公众号

 

原博主博客地址&#xff1a;https://blog.csdn.net/qq21497936
原博主博客导航&#xff1a;https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/106117514

 


推荐阅读
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
author-avatar
未来不是梦2602932127
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有