技术背景
在我们大多数音视频行业从业者的认知里,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低延迟设计的一点心得,感兴趣的开发者,可以单独跟我探讨。