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

news2024/12/23 14:51:45

技术背景

好多开发者希望我们分享下大牛直播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左右,应该可以满足大多数低延迟场景,比如监控、无人机巡检、智能机器人控制等。以上抛砖引玉,感兴趣的开发者,可以单独跟我沟通探讨

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

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

相关文章

速通前端篇 —— CSS

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:速通前端 目录 CSS的介绍 基本语法规范 CSS选择器 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 CSS常见样式 颜…

MySQL并发控制(二):锁

只改一行语句,为什么锁那么多 注1:MySQL后面的版本可能会改变加锁策略, 所以这个规则只限于截止到现在的最新版本, 即5.x系列 注2:因为间隙锁在可重复读隔离级别下才有效, 所以本篇文章接下来的描述&#…

从零开始的使用SpringBoot和WebSocket打造实时共享文档应用

在现代应用中,实时协作已经成为了非常重要的功能,尤其是在文档编辑、聊天系统和在线编程等场景中。通过实时共享文档,多个用户可以同时对同一份文档进行编辑,并能看到其他人的编辑内容。这种功能广泛应用于 Google Docs、Notion 等…

PHP保存base64编码图片,图片有一部分是灰色块儿,原因和解决办法

文章目录 场景原因解决方案完整的代码前端代码php代码 场景 我有个需求,移动端h5上传多张的图片。用input file可以上传多张,但是现在照片体积越来越大,同时上传多张会因为体积过大,导致上传失败。如果是小程序会好很多&#xff…

vue图片之放大、缩小、1:1、刷新、左切换、全屏、右切换、左旋咋、右旋转、x轴翻转、y轴翻转

先上效果&#xff0c;代码在下面 <template><!-- 图片列表 --><div class"image-list"><img:src"imageSrc"v-for"(imageSrc, index) in images":key"index"click"openImage(index)"error"handleI…

Oracle EBS FA 如何打开关闭的资产会计期间?

用户“运行折旧”,误勾选为“关闭期间”,还有一部分资产还需要操作报废和调整,希望后台打开关闭的资产会计期 系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.9 解决方案 由官方提供SQL脚本代码如下: /*rollback120.sql - for Release 12.X only(based on r…

Hash、HASHTABLE底层原理【Redis对象篇】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a;https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜&#xff0c;同时略懂Vue与React前端技术&#xff0c;也了解一点微信小程序开发。 &#x1f37b; 对计算机充满兴趣&#xff0c;愿意并且希望学习更多的技…

CentOS 二进制安装部署MongoDB 4.0

一、安装MongoDB 1. 下载 MongoDB 二进制文件 前往 MongoDB 官方下载页面(https://www.mongodb.com/try/download/community) 选择对应版本的 tar 包。 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.28.tgz 2. 解压并移动至目标目录 解压文件&#xff…

Redis篇-5--原理篇4--Lua脚本

1、概述 Redis 支持使用 Lua 脚本来执行复杂的操作&#xff0c;这为 Redis 提供了更强的灵活性和性能优化能力。通过 Lua 脚本&#xff0c;你可以在服务器端执行一系列命令&#xff0c;而不需要多次往返客户端与服务器之间&#xff0c;从而减少了网络延迟并提高了效率。此外&a…

新手上路,学Go还是Python

对于新手来说&#xff0c;Go和Python都是很好的编程语言&#xff0c;它们各有特点&#xff0c;以下是详细的对比来帮助你决定先学哪一个&#xff1a; 一、语法和学习难度 Python 语法简洁易懂&#xff1a;Python以其简洁、优雅的语法而闻名&#xff0c;代码的可读性很高。例如…

OceanBase 社区版 4.0 离线方式升级bp1至bp2 指南(含避坑总结)

注&#xff1a;目前社区版对 4.0 升级 bp1至 bp2也未有完善的文档&#xff0c;本次升级中也是遇到不少坑&#xff0c;写本文也希望对OB感兴趣的可以尝试少些遇坑。 也希望对升级有更好方式建议方式的朋友一起切磋交流&#xff0c;以便再进一步完善升级方案。 第一次做OB的升级&…

python学opencv|读取图像(六)读取图像像素RGB值

【1】引言 前序已经掌握了如何获取灰度图像的像素&#xff0c;文章链接为&#xff1a; python学opencv|读取图像&#xff08;五&#xff09;读取灰度图像像素-CSDN博客 实际上像素就像一个坐标轴&#xff0c;约束了图像的大小。 但实际上我们在学习过程中&#xff0c;对于同…

Linux kill、killall、pkill 命令区别

注&#xff1a;本文为 “Linux kill、killall、pkill” 相关几篇文章合辑。 未整理去重。 kill、killall、pkill、kill -9 区别 区别 进程 ID 唯一&#xff0c;所以 kill 一次只能杀死 1 个进程&#xff0c;其他相同名称的进程仍然存在&#xff0c;而 pkill 和 killall&#…

1139: Coin-row problem

解法&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e53; int dp[N]; int main() {int n;cin>>n;for (int i1;i<n;i) cin>>dp[i];for (int i2;i<n;i) {dp[i]max(dp[i-1],dp[i-2]dp[i]);}cout<<dp[n]<<endl;retur…

Ubuntu压缩打包解压

ubuntu压缩打包 上图&#xff0c;压缩当前目录svn 为svn.tar.gaz&#xff0c;解压后再当前解压目录生成svn文件 在Ubuntu中&#xff0c;你可以使用tar命令来创建一个压缩包&#xff0c;或者使用zip命令来创建一个.zip压缩文件。以下是两种常见的压缩方法&#xff1a; 下图&am…

Excel 合并工具 将文件复制到目标工作表中与操作日志记录

指定文件夹中读取符合条件的 Excel 文件&#xff0c;将其中的数据按照一定规则复制到目标工作表中&#xff0c;并进行相关的日志记录和工作簿保存操作。 先看下 excel 的结构 合并的结果 log 记录 vba 代码 Sub DeltaCheck()作者和创建时间的注释 定义工作表变量Dim ws As Wor…

Github----提交人不是自己

账号用户名都设置对的,但是提交人不是自己 解决 发现是用户名和账号都夹了"号导致 git config --global user.name "Your Name" git config --global user.email "your.emailexample.com"不用引号 git config --global user.name Your Name git …

ZZCMS2023存在跨站脚本漏洞(CNVD-2024-44822、CVE-2024-44818)

ZZCMS是一款用于搭建招商网站的CMS系统&#xff0c;由PHP语言开发&#xff0c;可快速搭建&#xff1a;医药招商、保健品招商、化妆品招商、农资招商、孕婴童招商、酒类副食类等招商网站。 国家信息安全漏洞共享平台于2024-11-14公布其存在跨站脚本漏洞。 漏洞编号&#xff1a…

[免费]SpringBoot+Vue企业OA自动化办公管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue企业OA自动化办公管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue企业OA自动化办公管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术在管理上越来越深入…

【MySQL】表的基本查询(下)

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…