Windows平台Unity3D下RTMP播放器低延迟设计探讨

技术背景

好多开发者希望我们分享下大牛直播SDK是如何在Unity下实现低延迟的RTMP播放的,以下是一些降低 Unity 中 RTMP 播放器延迟的方法:

一、选择合适的播放插件或工具

评估和选用专业的流媒体插件

  • 市场上有一些专门为 Unity 设计的流媒体插件,在选择插件时,要考虑其性能、稳定性、支持的功能以及用户评价等因素。可以先进行小规模的测试,对比不同插件在延迟方面的表现,选择最适合项目需求的插件。

使用专业的流媒体服务器和 SDK

  • 配合使用专业的流媒体服务器软件,如 Nginx-RTMP、Wowza Streaming Engine 等,可以对 RTMP 流进行更好的管理和优化。这些服务器通常提供一些配置选项,可以调整缓存大小、发送速率等参数,以降低延迟。
  • 一些流媒体 SDK(如 大牛直播SDK的SmartPlayer等)也可以在 Unity 中实现低延迟的实时视频播放。这些 SDK 通常针对实时通信进行了优化。

二、优化网络设置

确保良好的网络带宽

  • 低延迟的流媒体播放需要足够的网络带宽。确保网络连接稳定,并且带宽能够满足 RTMP 流的播放需求。可以通过以下方式来优化网络带宽:
  • 关闭其他占用大量网络带宽的应用程序或服务。
  • 如果可能,使用有线网络连接代替无线网络,以减少网络波动和延迟。
  • 对于上行链路(如果是自己推流),要确保推流设备有足够的上传带宽,以保证流的质量和稳定性。

调整缓冲设置

  • 大多数流媒体播放器都有缓冲设置,用于在播放前预先加载一定量的数据,以防止播放中断。但是,过大的缓冲会增加延迟。在 Unity 中使用的 RTMP 播放器插件中,尝试调整缓冲设置,将缓冲时间设置得尽可能短。
  • 不同的插件可能有不同的缓冲设置方法,一般可以在插件的文档或设置界面中找到相关选项。例如,在某些插件中,可以通过修改代码中的参数来调整缓冲大小。

选择合适的网络协议和传输方式

  • RTMP 通常使用 TCP 协议进行传输,TCP 协议保证了数据的可靠性,但可能会引入一定的延迟。在一些情况下,可以考虑使用 UDP 协议代替 TCP,以降低延迟。但是,UDP 协议不保证数据的可靠性,可能会出现丢包的情况,需要在播放端进行适当的错误处理。
  • 一些插件或流媒体服务器可能支持自适应的传输方式,根据网络状况自动选择最佳的协议和传输方式。启用这种自适应功能可以在不同的网络环境下获得更好的播放效果。

三、优化播放器设置和代码

开启硬件加速

  • 如果 Unity 项目运行的设备支持硬件加速,开启硬件加速可以大大提高视频解码和播放的速度,从而降低延迟。在 Unity 中,可以通过设置播放器插件的参数或使用特定的 API 来开启硬件加速。
  • 例如,对于某些插件,可以在初始化播放器时设置硬件加速的选项。同时,确保设备的驱动程序是最新的,以充分发挥硬件加速的性能。

优化播放逻辑和代码

  • 在 Unity 项目中,优化播放逻辑和代码可以提高性能,减少延迟。例如避免在播放过程中进行过多的计算和处理,尤其是在每一帧的更新中。如果需要进行一些复杂的计算,可以考虑在后台线程中进行,以避免影响播放性能。
  • 合理管理播放器的资源,及时释放不再使用的资源,避免内存泄漏和资源浪费。
  • 对播放代码进行性能分析,找出性能瓶颈,并进行针对性的优化。可以使用 Unity 的性能分析工具或其他第三方工具来分析代码的执行时间、内存使用等情况。

Unity下RTMP播放器延迟可以做到多少?

在 Unity 下 RTMP 播放器的延迟能做到多低受到多种因素的影响。

  1. 理论上的较低延迟情况
  • 在理想网络环境和优化设置下:如果网络状况非常好,带宽充足且稳定,并且在播放器的参数设置上进行了充分优化,比如使用硬件解码、开启低延迟模式、将缓冲时间设置得尽可能短等,有可能实现 500-1000毫秒左右的延迟。
  1. 实际应用中的延迟范围
  • 一般场景:在实际的项目应用中,由于网络环境的复杂性以及硬件性能的差异等因素,延迟通常会在2秒到 3 秒甚至更高。比如在一些普通的网络环境下,没有进行特别优化的情况下,延迟可能会接近1秒或更高。
  • 较差网络环境:如果网络状况较差,存在网络拥堵、丢包等情况,延迟可能会变得更高,甚至出现播放卡顿、无法正常播放的情况。

目前有一些专门的流媒体播放插件或 SDK 可以帮助降低延迟,例如大牛直播 SDK 等,它们针对 Unity 平台的 RTMP 和 RTSP 播放进行了优化,在一定程度上能够实现较低的延迟。但具体的延迟数值还是需要根据实际的项目情况进行测试和调整。

以大牛直播SDK的推送端(SmartPublisher)采集毫秒计数器时间,推送至nginx rtmp服务器,然后,unity的rtmp播放端从nginx服务器同时拉取4路rtmp流,延迟测试如下:

以下是SmartPlayer的功能设计,如不单独说明,系Windows、Linux(含x86_64|aarch64)、Android、iOS全平台支持。

  •  [支持播放协议]高稳定、超低延迟(毫秒级,行业内几无效果接近的播放端)、业内领先的RTMP直播播放器SDK;
  •  [多实例播放]支持多实例播放;
  •  [事件回调]支持网络状态、buffer状态等回调;
  •  [视频格式]支持RTMP扩展H.265和Enhanced RTMP H.265,H.264;
  •  [音频格式]支持AAC/PCMA/PCMU/Speex;
  •  [H.264/H.265软解码]支持H.264/H.265软解;
  •  [H.264硬解码]Windows/Android/iOS支持特定机型H.264硬解;
  •  [H.265硬解]Windows/Android/iOS支持特定机型H.265硬解;
  •  [H.264/H.265硬解码]Android支持设置Surface模式硬解和普通模式硬解码;
  •  [缓冲时间设置]支持buffer time设置;
  •  [首屏秒开]支持首屏秒开模式;
  •  [低延迟模式]支持低延迟模式设置(公网150~300ms);
  •  [复杂网络处理]支持断网重连等各种网络环境自动适配;
  •  [快速切换URL]支持播放过程中,快速切换其他URL,内容切换更快;
  •  [音视频多种render机制]Android平台,视频:SurfaceView/GLSurfaceView,音频:AudioTrack/OpenSL ES;
  •  [实时静音]支持播放过程中,实时静音/取消静音;
  •  [实时音量调节]支持播放过程中实时调节音量;
  •  [实时快照]支持播放过程中截取当前播放画面;
  •  [只播关键帧]Windows平台支持实时设置是否只播放关键帧;
  •  [渲染角度]支持0°,90°,180°和270°四个视频画面渲染角度设置;
  •  [渲染镜像]支持水平反转、垂直反转模式设置;
  •  [等比例缩放]支持图像等比例缩放绘制(Android设置surface模式硬解模式不支持);
  •  [实时下载速度更新]支持当前下载速度实时回调(支持设置回调时间间隔);
  •  [ARGB叠加]Windows平台支持ARGB图像叠加到显示视频(参看C++的DEMO);
  •  [解码前视频数据回调]支持H.264/H.265数据回调;
  •  [解码后视频数据回调]支持解码后YUV/RGB数据回调;
  •  [解码后视频数据缩放回调]Windows平台支持指定回调图像大小的接口(可以对原视图像缩放后再回调到上层);
  •  [解码前音频数据回调]支持AAC/PCMA/PCMU/SPEEX数据回调;
  •  [音视频自适应]支持播放过程中,音视频信息改变后自适应;
  •  [扩展录像功能]完美支持和录像SDK组合使用。

可以看到,整体延迟在毫秒级,比较好的网络环境下,甚至稳定在100ms左右,应该可以满足大多数低延迟场景,比如监控、无人机巡检、智能机器人控制等。以上抛砖引玉,感兴趣的开发者,可以单独跟我沟通探讨

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

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

相关文章

PaddleOCR模型ch_PP-OCRv3文本检测模型研究(一)骨干网络

从源码上看,PaddleOCR一共支持四个版本,分别是PP-OCR、PP-OCRv2、PP-OCRv3、PP-OCRv4。本文选择PaddleOCR的v3版本的骨干网络作为研究对象,力图探究网络模型的内部结构。 文章目录 研究起点卷归层压发层残差层骨干网代码实验小结 研究起点 参…

log4j漏洞复现--vulhub

声明:学习过程参考了同站的B1g0rang大佬的文章 Web网络安全-----Log4j高危漏洞原理及修复(B1g0rang) CVE-2021-44228 RCE漏洞 Log4j 即 log for java(java的日志) ,是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输…

计算机网络ENSP课设--三层架构企业网络

本课程设计搭建一个小型互联网,并模拟Internet的典型Web服务过程。通过此次课程设计,可以进一步理解Internet的工作原理和协议过程,并提高综合知识的运用能力和分析能力。具体目标包括: (1)掌握网络拓扑的…

SQL 获取今天的当月开始结束范围:

使用 GETDATE() 结合 DATEADD() 和 DATEDIFF() 函数来获取当前月的开始和结束时间范围。以下是实现当前月时间范围查询的 SQL&#xff1a; FDATE > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) FDATE < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) 1, 0) …

Go的Gin比java的Springboot更加的开箱即用?

前言 隔壁组的云计算零零后女同事&#xff0c;后文简称 云女士 &#xff0c;非说 Go 的 Gin 框架比 Springboot 更加的开箱即用&#xff0c;我心想在 Java 里面 Springboot 已经打遍天下无敌手&#xff0c;这份底蕴岂是 Gin 能比。 但是云女士突出一个执拗&#xff0c;非我要…

【2024最新Java面试宝典】—— SpringBoot面试题(44道含答案)

1. 什么是 Spring Boot&#xff1f; Spring Boot 是 Spring 开源组织下的子项目&#xff0c;是 Spring 组件一站式解决方案&#xff0c;主要是简化了使用 Spring 的难度&#xff0c;简省了繁重的配置&#xff0c;提供了各种启动器&#xff0c;使开发者能快速上手。 2. 为什么…

【PlantUML系列】用例图(三)

目录 一、组成部分 二、典型案例 一、组成部分 参与者&#xff08;Actors&#xff09;&#xff1a;使用关键字 actor 后跟参与者的名称。用例&#xff08;Use Cases&#xff09;&#xff1a;使用关键字 usecase 后跟用例的名称和编号&#xff08;可选&#xff09;。系统边界…

C++命运石之门代码抉择:C++入门(上)

文章目录 1.前言1.1 什么是C1.2 C的发展1.3 C的重要性1.4 如何学习C1.5 C要学什么 2. C语言过渡到C(上)2.1 域2.1.1 命名空间2.1.1.1 定义2.1.1.2 作用域限定符2.1.1.3 使用 2.1.2 域的使用优先级 2.2 输入及输出2.2.1 std 命名空间及自定义命名空间2.2.2 .C输入&输出 2.3 …

Composer在安装的过程中经常找不到刚更新的包

明明有v2.1.0版本&#xff0c;安装就是找不到这个版本的包。 1. Composer 官方网址&#xff1a;https://getcomposer.org 中文网站&#xff1a;https://www.phpcomposer.com 官方文档&#xff1a;https://docs.phpcomposer.com 2. Packagist Packagist 是 Composer的组件仓库…

Android笔记【14】结合LaunchedEffect实现计时器功能。

一、问题 cy老师第五次作业 结合LaunchedEffect实现计时器功能。要求&#xff1a;动态计时&#xff0c;每秒修改时间&#xff0c;计时的时间格式为“00&#xff1a;00&#xff1a;00”&#xff08;小时&#xff1a;分钟&#xff1a;秒&#xff09;提交源代码的文本和运行截图…

【强化学习入门笔记】 2.1 值迭代

本系列为学习赵世钰老师的《强化学习的数学原理》所作的学习笔记. 本节我们将介绍强化学习中的值迭代求解方法. 2.1.1 算法步骤 在1.5节我们介绍了通过迭代可以求贝尔曼最优公式的最优解, 这个方法就叫值迭代: v k 1 max ⁡ π ∈ Π ( r π γ P π v k ) , k 0 , 1 , …

汽车车牌标记支持YOLO,COCO,VOC三种格式标记,4000张图片的数据集

本数据集支持YOLO&#xff0c;COCO&#xff0c;VOC三种格式标记汽车车牌&#xff0c;无论是新能源汽车还是油车都能识别标记&#xff0c;该数据集一共包含4000张图片 数据集分割 4000总图像数 训练组 70&#xff05; 2800图片 有效集 20&#xff05; 800图片 测…

python基础:(八)文件

目录 一.从文件中读取数据1.1读取整个文件1.2文件路劲1.3逐行读取 二.写入文件 一.从文件中读取数据 各位小伙伴&#xff0c;文件这一块得好好学&#xff0c;多看多敲代码&#xff0c;以后处理数据&#xff0c;写爬虫少不了这个&#xff0c;先从基础&#xff08;简单的&#x…

输电线路故障测距研究

故障分析法容易受到过渡电阻、故障类型等因素的影响&#xff0c;从而造成测距误差较大。 行波法不受电力系统运行方式的影响&#xff0c;得到了广泛的应用。波头信息的提取方法主要有&#xff1a;小波变换、希尔伯特黄变换、TT变换等。 智能测距法逐渐被应用于输电线路故障测…

FPGA实战篇(IP核之MMCM/PLL实验)

1.MMCM/PLL IP 核简介 锁相环作为一种反馈控制电路&#xff0c;其特点是利用外部输入的参考信号控制环路内部震荡信号的频率和相位。因为锁相环可以实现输出信号频率对输入信号频率的自动跟踪&#xff0c;所以锁相环通常用于闭环跟踪电路。 锁相环在工作的过程中&#xff0c;当…

wordpress网站安装了Linux宝塔面板,限制IP地址访问网站,只能使用域名访问网站

一、Linux服务器安装Linux宝塔面板 这个步骤参考网上其他教程。 二、Linux宝塔面板部署wordpress网站 这个步骤参考网上其他教程&#xff0c;保证网站能够正常访问&#xff0c;并且使用Linux宝塔面板申请并部署了SSL证书&#xff0c;使用https协议默认443端口正常访问。 三…

顶顶通电话机器人开发接口对接大语言模型之实时流TTS对接介绍

大语言模型一般都是流式返回文字&#xff0c;如果等全部文字返回了一次性去TTS&#xff0c;那么延迟会非常严重&#xff0c;常用的方法就是通过标点符号断句&#xff0c;返回了一句话就提交给TTS。随着流TTS的出现&#xff0c;就可以直接把大模型返回的文字灌给流TTS&#xff0…

leetcode每日一题(20241210)

leetcode每日一题&#xff08;20241210&#xff09;今天依旧是棋盘类型的题目&#xff0c;但是今天的只是表面相关&#xff0c;看题&#xff1a; 935.骑士拨号器 题目描述&#xff1a; 象棋骑士有一个独特的移动方式&#xff0c;它可以垂直移动两个方格&#xff0c;水平移动一…

记录ubuntu22.04重启以后无法获取IP地址的问题处理方案

现象描述&#xff1a;我的虚拟机网络设置为桥接模式&#xff0c;输入ifconfig只显示127.0.0.1&#xff0c;不能连上外网。&#xff0c;且无法上网&#xff0c;用ifconfig只有如下显示&#xff1a; 1、sudo -i切换为root用户 2、输入dhclient -v 再输入ifconfig就可以看到多了…

MVC基础——市场管理系统(一)

文章目录 项目地址一、创建项目结构1.1 创建程序以及Controller1.2 创建View1.3 创建Models层,并且在Edit页面显示1.4 创建Layou模板页面1.5 创建静态文件css中间件二、Categories的CRUD2.1 使用静态仓库存储数据2.2 将Categorie的列表显示在页面中(List)2.3 创建_ViewImport.…