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

ops/2024/12/13 2:14:17/

技术背景

好多开发者希望我们分享下大牛直播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.ppmy.cn/ops/141405.html

相关文章

docker安装ddns-go(外网连接局域网)

docker先下载镜像,目前最新版是v6.7.6 也可以csdn资源下载 再导入dockers https://download.csdn.net/download/u014756339/90096748 docker load -i ddns-go.tar 启动 docker run -d --name ddns-go --restartalways --nethost -v /opt/ddns-go:/root jeessy/…

设计模式 在PLM系统的应用场景介绍

通义灵码 设计模式在 PLM(产品生命周期管理)系统中扮演着重要的角色,可以帮助开发人员更好地组织代码、提高系统的可维护性和扩展性。以下是一些常见的设计模式及其在 PLM 系统中的应用场景: 1. 单例模式(Singleton …

echarts自定义仪表盘样式及一些属性了解

目录 一、自定义仪表盘 1.仪表盘相关 2.常用属性 (1)series (2)graphic 二、自定义仪表盘 1.基本仪表盘绘制 2.分析结构,分别绘制 (1)自定义形状 (2)仪表盘各部…

C# WPF抽奖程序

C# WPF抽奖程序 using Microsoft.Win32; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.…

如何进行 JavaScript 性能优化?

要进行 JavaScript 性能优化,我们可以从多个角度进行思考,主要包括减少页面渲染时间、减少内存占用、优化代码执行效率等。以下是优化的一些方法,并结合实际项目代码示例讲解。 目录结构 减少 DOM 操作 缓存 DOM 元素批量更新 DOM 优化 Jav…

webstorm开发uniapp(从安装到项目运行)

1、下载uniapp插件 下载连接:Uniapp Tool - IntelliJ IDEs Plugin | Marketplace (结合自己的webstorm版本下载,不然解析不了) 将下载到的zip文件防在webstorm安装路径下,本文的地址为: 2、安装uniapp插…

【linux】shell(33)-函数

编写和使用函数是 shell 脚本编程中的一个重要方面。函数可以帮助你组织代码,提高代码的可读性和可重用性。 1. 定义函数 在 shell 脚本中,定义函数的基本语法有两种: # 语法 1 function function_name {# 函数体 }# 语法 2 function_name…

3356. 零数组变换 Ⅱ

3356、[中等] 零数组变换 Ⅱ 1、题目描述 给你一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] [li, ri, vali]。 每个 queries[i] 表示在 nums 上执行以下操作: 将 nums 中 [li, ri] 范围内的每个下标对应元素的值 最多 减少…