别再吹牛逼说什么零延迟了,不可能的事

news/2024/9/24 9:54:18

关于流媒体推拉流延时的几点说明。

  • 经常看到一些流媒体相关的程序,号称零延迟,不用怀疑,这肯定吹牛逼的。
  • 搞音视频开发,有个核心的指标就是实时性,也就是延迟多少毫秒,这个问题问的也是最多的。
  • 音视频文件几乎不存在实时性问题,只有音视频流才有实时性的指标。
  • 延迟多久这个涉及到很多方面,也要看你如何计算,从推流开始计算还是从拉流开始计算。
  • 很多小伙伴们并不能明白什么叫延时,认为随便一个播放器播放出来的画面跟原始流画面时间差就是延时,其实这是对延时最大的误解。延时不是表象,很多人在测试延时时很不专业,对延时测试的专业性认识不足。
  • 下面整理的是zlm作者写的关于延时的文章,非常完整而且有代表性。
  • 采集延时:在采集摄像头或显卡画面时,由于fps的限制和cpu性能、内存拷贝速度等客观限制,采集画面成YUV/RGB等数据时会有一定的延时,一般延时为毫秒级别。由于一般编码器对输入数据格式存在限制,譬如要求统一输入YUV420P,这样在做RGB->YUV420P转换时,也会有转换计算延时(这个可以通过libyuv库来降低)。总而延时,采集延时大概为毫秒级别,如果fps为25,那么一般采集延时会有40毫秒(1000毫秒/25fps)以上的延时,在内存拷贝和颜色转换时,又可能增加若干毫秒的延时。
  • 编码延时:在把原始画面输入到编码器时,并不会立即输出编码后的数据,特别是在开启B帧时,由于需要参考后面的P帧,那么延时会更大,所以延时敏感的情况下一般不开启B帧,这种情况下编码延时应该是毫秒级别,不是很大。
  • 上行延时:编码后的数据,要经过一定的协议打包才能写入socket,然后传输给推流服务器或拉流代理服务器,协议打包会有一定的内存拷贝和计算量,那么会增加延时,不过这个延时很小,基本忽略不计。数据在上传到服务器时,这个延时可大可小,取决于网络质量。
  • 转换延时:服务器在收到数据后,要读socket缓存、协议解析、解复用、重新打包等操作,不过总体而言,这个延时比较小,基本没什么影响。有时,服务器为了提高性能,会采取合并写的机制,也就是收到一定量的数据后才会一并转发,这个延时一般为几百毫秒,ZLMediaKit默认300毫秒左右,不过ZLMediaKit默认关闭合并写,也就是这个延时也很小。
  • 下行延时:流媒体在把视频数据转发给播放器时,会存在网络发送,这个延时大小取决于网络质量,ZLMediaKit在关闭低延时模式时,还会增加MSG_MORE和关闭TCP_NODELAY导致的延时,不过ZLMediaKit默认开启低延时模式。
  • 播放延时:播放器延时主要有网路接收延时、协议解析解复用延时、解码延时、缓存延时、渲染延时组成,这些延时中缓存延时最大,因为一般的播放器为了保证在网络抖动情况下视频播放的流畅性,会以增加延时为代价,增加播放缓存,这样在网络变差时,不至于播放缓冲卡顿。而且为了音视频同步,也必须确保一定的缓存量。这种延时一般都是秒级别,一般5秒左右。有部分播放策略是接收到数据后立即解码显示比如rtsp视频流,这样可以做到延迟最小。
  • 缓存延时:流媒体服务器为了能让播放器立即出画面,往往会缓存最近的一个I帧,这个I帧往后的所有音视频数据被称作为GOP缓存。如果不缓存GOP,那么播放器要等下一个I帧才能解码成功或不花屏,显然为了提高播放体验,这个GOP缓存是不能去掉的。而一般GOP短则1~3秒,长则10几秒,这个跟采集端编码器设置有关,服务器改变不了。但是由于一般的播放器收到缓存后,并不会丢弃过多的画面来确保低延时。况且播放器还希望有一定的缓存来确保播放的流畅性,所以这个GOP缓存将会增大播放器的延时。
  • 综合延时:最快可以做到200-300ms的延迟,比如rtsp视频流,对实时性要求高,可以不做缓存和音视频同步,收到就立即解码播放。hls一般最快可以做到5s延迟,flv一般可以做到3s延迟。
  • 最终总结:综合考虑实时性以及支持的音视频格式,个人建议,推流用rtsp推流(支持的音视频格式最友好,比如支持265),拉流在web上个人推荐用ws-flv格式拉流(支持的格式多,没有6个同源的限制),拉流在可执行文件上用rtsp(格式多而且实时性最好,可以最快速度解码播放),在网页上虽然webrtc实时性最好,但是不支持265,这个就难搞。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/64060.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

css的属性选择器使用

感谢 https://www.runoob.com/css/css-attribute-selectors.html 的底部评论 https://www.runoob.com/cssref/css-selectors.html 虽然一直有用到属性选择器,但是缺乏全面的了解,都是用到了就百度,看到一个大佬的总结评论,做个记录 CSS 属性选择器 ~=, |=, ^=, $=, *= 的区别 …

AdEMAMix: 一种创新的神经网络优化器

这是9月发布的一篇论文,Pagliardini等人在其论文中提出了一种新的优化算法——AdEMAMix。这种算法旨在解决当前广泛使用的Adam及其变体(如AdamW)在利用长期梯度信息方面的局限性。研究者们通过巧妙地结合两个不同衰减率的指数移动平均(EMA),设计出了这种新的优化器,以更…

Vue 基本使用

基本使用,组件使用❗必须要会! 高级特性 不常用,但可以体现你的知识深度 Vuex 和 Vue router❗重要 考察频率高面试题👇1. 指令 插值computed和watchcomputed的值没变,会缓存起来 watch 深度监听: deep: true,有子属性会遍历下去。 class和style 动态属性、驼峰写法条件…

绘制印章的开源工具DrawStampUtils使用

最近写了一个绘制印章的工具DrawStampUtils,具有比较完整的印章修改效果,定制化度较高,git地址(https://github.com/xxss0903/drawstamputils),也可以在npmjs中搜索DrawStampUtils即可// 将要绘制的canvas组件的引用传入,还有就是对应的毫米转像素的大小传入即可const sta…

从零开始学机器学习——什么是机器学习

机器学习作为人工智能的重要组成部分,通过算法自动发现数据中的模式和规律,从而使我们能够做出预测和决策。在学习过程中,我们强调了重要的关键词汇和步骤,包括训练数据集、模型、训练方法和调优过程。这个系列的文章旨在为初学者提供机器学习知识,避免使用专业术语和复杂…

Spark(八)SparkSQL概述

概述Hive是将SQL转为MapReduce SparkSQL可以理解成是将SQL解析成:“RDD+优化”再执行 SparkSQL可以简化RDD的开发,提高开发效率,且执行效率非常快 Spark SQL为了简化RDD的开发,提高开发效率,提供了2个编程抽象,DataFrame和DataSet,类似Spark Core中的RDD1. SparkSQL特点易…

js DOM学习的综合样例

js DOM学习的综合样例 本人简单学习了一点md语法,写出来的博客会更好看喵. 样例介绍 主要实现利用DOM的获取标签对象的功能和对监听功能实现三个功能:(1)开灯,关灯(2)对标签进行全选,反选(3)对文本框聚焦时字母为大写,反之为小写基本实现方法(1)开灯关灯:a.用img标签贴图关灯的…

救园最后7天:「坚持你所相信的,相信你所坚持的」

从7月15日开始的救园还剩最后7天,很有希望,也很紧张,能否救园成功,取决于最后7天有多少园友出手相救。前二十年,我们选择了「坚持我们所相信的」,相信真心为开发者服务,一定会有出路,我们坚持了下来。在第二十年遇到最大难关时,我们选择了「相信我们所坚持的」从7月15…