RTMP如何实现毫秒级延迟体验?

技术背景

在我们大多数音视频行业从业者的认知里,RTMP播放器的延迟通常可以做到2到3秒。实际上,在较为理想的网络环境和优化良好的系统设置下,RTMP播放器一样可以做到几百毫秒的延迟水平。今天就影响RTMP播放延迟的一些因素,做个大概的探讨,首先,无图无真相,看看我们实际开发的RTMP播放器,延迟大概做到什么水准:

绝大多数开发者,可能觉得,RTSP的延迟,一般来说是比RTMP低很多的,以下是大牛直播SDK的Android平台实现的屏幕采集功能,然后分别启动了轻量级RTSP服务,和推送到RTMP服务器。

Windows客户端通过SmartPlayer播放器,分别播放RTSP和RTMP流,延迟如下,可以看到,RTMP播放器拉流,一样可以达到毫秒级可满足平衡操控场景(比如远程机器人操控、无人机、矿场矿车、无人挖掘机等高危作业场景)的极低延迟体验:

如何实现低延迟RTMP播放

一、优化编码设置

选择高效的编码格式

  • H.264 是目前广泛使用的视频编码格式,具有较高的压缩效率和良好的兼容性。在使用 RTMP 传输时,可以选择 H.264 编码格式,并根据实际情况调整编码参数,以降低编码延迟。
  • 对于音频编码,可以选择 AAC 等高效的编码格式,减少音频编码的时间和数据量。

调整编码参数

  • 降低视频的分辨率和帧率可以减少编码的数据量,从而降低编码延迟。但是,分辨率和帧率过低会影响视频的质量,需要根据实际需求进行平衡。
  • 调整编码的比特率也可以影响编码延迟。降低比特率可以减少数据量,但可能会导致视频质量下降。需要根据网络状况和视频质量要求进行合理调整。
  • 开启编码的硬件加速功能可以提高编码效率,降低编码延迟。如果设备支持硬件编码,可以在编码软件中开启硬件加速选项。

二、优化服务器设置

选择高性能的服务器

  • 选择配置高、性能好的服务器可以提高服务器的处理能力和带宽,减少数据在服务器端的处理时间和排队等待时间,从而降低延迟。
  • 可以选择专业的流媒体服务器软件,如 Nginx RTMP ,SRS等,这些软件具有更好的性能和稳定性,可以提供更低的延迟。

调整服务器参数

  • 调整服务器的缓存设置可以影响延迟。降低缓存大小可以减少数据在服务器端的缓存时间,从而降低延迟。但是,缓存过小可能会导致播放不流畅,需要根据实际情况进行调整。
  • 开启服务器的实时推送功能可以减少数据在服务器端的处理时间,提高推送效率,从而降低延迟。实时推送功能可以在服务器软件的配置文件中进行开启。

三、优化网络设置

选择稳定的网络环境

  • 选择稳定、高速的网络环境可以减少网络延迟和丢包率,提高数据传输的效率,从而降低 RTMP 播放器的延迟。可以选择有线网络连接或者稳定的无线网络连接。
  • 如果使用无线网络连接,需要确保信号强度良好,避免信号干扰和衰减。可以使用信号增强器或者调整无线路由器的位置和参数,提高无线网络的稳定性和速度。

调整网络参数

  • 调整网络的带宽限制可以影响数据传输的速度和延迟。如果网络带宽有限,可以适当降低视频的分辨率和帧率,或者调整编码的比特率,以减少数据量,提高数据传输的效率。
  • 开启网络的 QoS(Quality of Service)功能可以优化网络流量,提高关键数据的传输优先级,减少延迟和丢包率。QoS 功能可以在路由器或者网络设备的设置中进行开启和配置。

四、优化播放器设置

选择低延迟的播放器

  • 不同的RTMP播放器在延迟方面可能会有所不同,如 VLC 播放器、PotPlayer 等,这些播放器,适用于音视频点播,功能大而全,但是对RTMP的支持,并不太友好,甚至需要5-7秒的延迟。可以采用比如大牛直播SDK的SmartPlayer这种专门为低延迟直播场景打造的具有更好的性能和更低的延迟专业播放器。

调整播放器参数

  • 调整播放器的缓存设置可以影响延迟。降低缓存大小可以减少数据在播放器端的缓存时间,从而降低延迟。但是,缓存过小可能会导致播放不流畅,需要根据实际情况进行调整。
  • 开启播放器的硬件加速功能可以提高播放效率,降低延迟。如果设备支持硬件解码,可以在播放器的设置中开启硬件加速选项。

RTMP播放器功能设计

以大牛直播SDK的SmartPlayer播放器为例,我们设计的RTMP播放器功能如下,如不单独说明,系Windows、Linux(含x86_64|aarch64)、Android、iOS全平台支持。

  •  [多实例播放]支持多实例播放;
  •  [事件回调]支持网络状态、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组合使用。

以Android平台为例,RTMP|RTSP播放器接口设计如下:

Android RTSP|RTMP播放端接口设计

调用描述

接口

接口描述

最先调用,如成功返回播放实例

SmartPlayerOpen

player初始化,设置上下文信息,返回player句柄

Event回调

SetSmartPlayerEventCallbackV2

设置event callback

硬解码设置H.264

SetSmartPlayerVideoHWDecoder

设置是否用H.264硬解码播放,如硬解码不支持,自动适配到软解码

硬解码设置H.265

SetSmartPlayerVideoHevcHWDecoder

设置是否用H.265硬解码播放,如硬解码不支持,自动适配到软解码

视频画面

填充模式

SmartPlayerSetRenderScaleMode

设置视频画面的填充模式,如填充整个view、等比例填充view,如不设置,默认填充整个view

设置SurfaceView模式下render类型

SmartPlayerSetSurfaceRenderFormat

设置SurfaceView模式下(NTRenderer.CreateRenderer第二个参数传false的情况),render类型

0: RGB565格式,如不设置,默认此模式; 1: ARGB8888格式

设置SurfaceView模式下抗锯齿效果

SmartPlayerSetSurfaceAntiAlias

设置SurfaceView模式下(NTRenderer.CreateRenderer第二个参数传false的情况),抗锯齿效果,注意:抗锯齿模式开启后,可能会影像性能,请慎用

设置播放的surface

SmartPlayerSetSurface

设置播放的surface,如果为null,则播放纯音频

设置视频硬解码下Mediacodec自行绘制模式

SmartPlayerSetHWRenderMode

此种模式下,硬解码兼容性和效率更好,回调YUV/RGB、快照和图像等比例缩放功能将不可用

更新硬解码surface

SmartPlayerUpdateHWRenderSurface

设置更新硬解码surface

音频回调

YUV/RGB

SmartPlayerSetExternalRender

提供解码后YUV/RGB数据接口,供用户自己render或进一步处理(如视频分析)

Audio

SmartPlayerSetExternalAudioOutput

回调audio数据到上层(供二次处理之用)

audio输出类型

SmartPlayerSetAudioOutputType

如果use_audiotrack设置为0,将会自动选择输出设备,如果设置为1,使用audiotrack模式,一对一回音消除模式下,请选用audiotrack模式

Video输出类型

NTRenderer.CreateRenderer(上层demo内)

第二个参数,如果是true,用openGLES绘制,false则用默认surfaceView

播放模式

缓冲时间设置

SmartPlayerSetBuffer

设置播放端缓存数据buffer,单位:毫秒,如不需buffer,设置为0

首屏秒开

SmartPlayerSetFastStartup

设置快速启动后,如果CDN缓存GOP,实现首屏秒开

低延迟模式

SmartPlayerSetLowLatencyMode

针对类似于平衡操控超低延迟的使用场景,超低延迟播放模式下,延迟可达到100-300ms

快速切换URL

SmartPlayerSwitchPlaybackUrl

快速切换播放url,快速切换时,只换播放source部分,适用于不同数据流之间,快速切换(如娃娃机双摄像头切换或高低分辨率流切换)

RTSP TCP/UDP模式设置

SmartPlayerSetRTSPTcpMode

设置RTSP TCP/UDP模式,如不设置,默认UDP模式

RTSP超时时间设置

SmartPlayerSetRTSPTimeout

设置RTSP超时时间,timeout单位为秒,必须大于0

设置RTSP TCP/UDP自动切换

SmartPlayerSetRTSPAutoSwitchTcpUdp

对于RTSP来说,有些可能支持rtp over udp方式,有些可能支持使用rtp over tcp方式

为了方便使用,有些场景下可以开启自动尝试切换开关, 打开后如果udp无法播放,sdk会自动尝试tcp, 如果tcp方式播放不了,sdk会自动尝试udp.

设置RTSP用户名和密码

SetRTSPAuthenticationInfo

如果RTSP URL已包含用户名和密码, 此接口设置的用户名和密码将无效. 就是说要用这个接口设置的用户名和密码去做认证, RTSP URL不能包含用户名和密码.

实时静音

SmartPlayerSetMute

实时静音

设置播放音量

SmartPlayerSetAudioVolume

播放端音量实时调节,范围[0,100],0时为静音,100为原始流数据最大音量

设置是否禁用 Enhanced

 RTMP

DisableEnhancedRTMP

disable enhanced RTMP, SDK默认是开启enhanced RTMP的

实时截图

CaptureImage

支持JPEG和PNG两种格式

视频镜像旋转

旋转

SmartPlayerSetRotation

设置顺时针旋转, 注意除了0度之外, 其他角度都会额外消耗性能,当前支持 0度,90度, 180度, 270度 旋转

水平反转

SmartPlayerSetFlipHorizontal

设置视频水平反转

垂直反转

SmartPlayerSetFlipVertical

设置视频垂直反转

设置URL

SmartPlayerSetUrl

设置需要播放或录像的RTMP/RTSP url

开始播放

SmartPlayerStartPlay

开始播放RTSP/RTMP流

停止播放

SmartPlayerStopPlay

停止播放RTSP/RTMP流

关闭播放实例

SmartPlayerClose

结束时必须调用close接口释放资源

总结

如果要实现低延迟的RTMP解决方案,可以从编码、服务器、网络、播放器和其他方面这几个角度来考虑降低RTMP播放器延迟的方法。在编码方面,选择高效编码格式和调整编码参数;RTMP服务器选择高性能服务器和调整服务器参数;网络方面,有选择稳定网络环境和调整网络参数;RTMP播放器方面,选择专为直播场景打造的低延迟播放器,并调整播放器参数,以达到好的播放体验。以上是RTMP低延迟设计的一点心得,感兴趣的开发者,可以单独跟我探讨。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle数据库 用户管理模式下的冷备份与热备份

1. 用户管理模式下的冷备份 1.1. 通过数据库相关视图查询 查实例 select instance_name,version,status,archiver,database_status from v$instance; 查数据库 select dbid,name,log_mode from v$database; 查数据文件状态 select file_name,tablespace_name,status,o…

【k8s 深入学习之 event 聚合】event count累记聚合(采用 Patch),Message 聚合形成聚合 event(采用Create)

参考 15.深入k8s:Event事件处理及其源码分析 - luozhiyun - 博客园event 模块总览 EventRecorder:是事件生成者,k8s组件通过调用它的方法来生成事件;EventBroadcaster:事件广播器,负责消费EventRecorder产生的事件,然后分发给broadcasterWatcher;broadcasterWatcher:用…

浙江工业大学《2024年828自动控制原理真题》 (完整版)

本文内容,全部选自自动化考研联盟的:《浙江工业大学828自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题

AI开发:用模型来识别手写数字的完整教程含源码 - Python 机器学习

今天一起来学习scikit-learn 。 scikit-learn 是一个强大的 Python 机器学习库,提供多种分类、回归、聚类算法,适用于从数据预处理到模型评估的全流程。它支持简单一致的 API,适合快速构建和测试模型。 官方地址在这里,记得Mark…

【Docker】创建Docker并部署Web站点

要在服务器上创建Docker容器,并在其中部署站点,你可以按照以下步骤操作。我们将以Flask应用为例来说明如何完成这一过程。 1. 准备工作 确保你的服务器已经安装了Docker。如果没有,请根据官方文档安装: Docker 安装指南 2. 创…

cgo内存泄漏排查

示例程序&#xff1a; package main/* #include <stdlib.h> #include <string.h> #include <stdio.h> char* cMalloc() {char *mem (char*)malloc(1024 * 1024 * 16);return mem; } void cMemset(char* mem) {memset(mem, -, 1024 * 1024 * 16); } int arr…

在做题中学习(76):颜色分类

解法&#xff1a;三指针 思路&#xff1a;用三个指针&#xff0c;把数组划分为三个区域&#xff1a; for循环遍历数组&#xff0c;i遍历数组&#xff0c;left是0区间的末尾&#xff0c;right是2区间的开头&#xff0c;0 1 2区间成功被划分 而上面的图画是最终实现的图样&…

性能测试基础知识jmeter使用

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;测试_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 性能指标 1. 并发数 (Con…

AWS创建ec2实例并连接成功

aws创建ec2实例并连接 aws创建ec2并连接 1.ec2创建前准备 首先创建一个VPC隔离云资源并且有公有子网 2.创建EC2实例 1.启动新实例或者创建实例 2.创建实例名 3.选择AMI使用linux(HVM) 4.选择实例类型 5.创建密钥对下载到本地并填入密钥对名称 6.选择自己创建的VPC和公有子网…

Flutter提示错误:无效的源发行版17

错误描述 Flutter从3.10.1 升级到3.19.4&#xff0c;在3.10.1的时候一切运行正常&#xff0c;但是当我将Flutter版本升级到3.19.4后&#xff0c;出现了下方的错误 FAILURE: Build failed with an exception.* What went wrong: Execution failed for task :device_info_plus:…

Android ConstraintLayout 约束布局的使用手册

目录 前言 一、ConstraintLayout基本介绍 二、ConstraintLayout使用步骤 1、引入库 2、基本使用&#xff0c;实现按钮居中。相对于父布局的约束。 3、A Button 居中展示&#xff0c;B Button展示在A Button正下方&#xff08;距离A 46dp&#xff09;。相对于兄弟控件的约束…

2025年申报建筑工程副高职称需要准备什么材料呢?

2025年湖北职称评审可以开始准备了&#xff0c;千万不要等到明临时报名开始才想起来准备哟&#xff0c;都是要提前的。 职称分为五个级别&#xff1a;技术员、初级职称、中级职称、副高职称、高级职称 我们最常见评审的就是中级职称和副高职称评审了&#xff0c;今天一起来看下…

“原批教育家”原批之星鲁健的杰作——原批俱乐部

伟大的原批教育家——原批之星&#xff0c;名为鲁健&#xff0c;是一位在南京邮电大学智能科学与技术专业中崭露头角的杰出人物。他不仅以其卓越的黑客技术和对网络正义的执着而闻名&#xff0c;更是“远古四神”之一&#xff0c;以其对原批之力的深刻理解和不同见解&#xff0…

底层逻辑之:欧拉-拉格朗日方程(Euler-Lagrange equations)变分法(Calculus of Variations)的核心思想

0前言&#xff1a; 0.1 17世纪的泛函&#xff08;Functional&#xff09;分析与变分法&#xff08;Calculus of Variations&#xff09; 在17世纪&#xff0c;数学家们开始遇到一些需要处理函数集合的问题&#xff0c;这些问题涉及到函数的极值、曲线的长度、曲面的面积等。这…

大数据实验E5HBase:安装配置,shell 命令和Java API使用

实验目的 熟悉HBase操作常用的shell 命令和Java API使用&#xff1b; 实验要求 掌握HBase的基本操作命令和函数接口的使用&#xff1b; 实验平台 操作系统&#xff1a;Linux&#xff08;建议Ubuntu16.04或者CentOS 7 以上&#xff09;&#xff1b;Hadoop版本&#xff1a;3…

微信小程序3-显标记信息和弹框

感谢阅读&#xff0c;初学小白&#xff0c;有错指正。 一、实现功能&#xff1a; 在地图上添加标记点后&#xff0c;标记点是可以携带以下基础信息的&#xff0c;如标题、id、经纬度等。但是对于开发来说&#xff0c;这些信息还不足够&#xff0c;而且还要做到点击标记点时&a…

一个有意思pytorch的简单应用小实验

通过一个简单的脚本&#xff0c;来学习pytorch的基本应用&#xff0c;比如&#xff1a;前向传播、反向传播、学习率以及预测、模型的基本原理和套路。 得到结果。。。保存模型。。。输入参数。。。预测。。。像不像&#xff1f;。。。像多少&#xff1f;。。。 设计目标&#x…

SpringBoot 分层解耦

从没有分层思想到传统 Web 分层&#xff0c;再到 Spring Boot 分层架构 1. 没有分层思想 在最初的项目开发中&#xff0c;很多开发者并没有明确的分层思想&#xff0c;所有逻辑都堆砌在一个类或一个方法中。这样的开发方式通常会导致以下问题&#xff1a; 代码混乱&#xff1…

2024 数学建模国一经验分享

2024 数学建模国一经验分享 背景&#xff1a;武汉某211&#xff0c;专业&#xff1a;计算机科学 心血来潮&#xff0c;就从学习和组队两个方面指点下后来者&#xff0c;帮新人避坑吧 2024年我在数学建模比赛中获得了国一&#xff08;教练说论文的分数是湖北省B组第一&#xff0…

Linux 35.6 + JetPack v5.1.4之RTP实时视频Python框架

Linux 35.6 JetPack v5.1.4之RTP实时视频Python框架 1. 源由2. 思路3. 方法论3.1 扩展思考 - 慎谋而后定3.2 扩展思考 - 拒绝拖延或犹豫3.3 扩展思考 - 哲学思考3.4 逻辑实操 - 方法论 4 准备5. 分析5.1 gst-launch-1.05.1.1 xvimagesink5.1.2 nv3dsink5.1.3 nv3dsink sync05…