技术背景
在我们大多数音视频行业从业者的认知里,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组合使用。
总结
如果要实现低延迟的RTMP解决方案,可以从编码、服务器、网络、播放器和其他方面这几个角度来考虑降低RTMP播放器延迟的方法。在编码方面,选择高效编码格式和调整编码参数;RTMP服务器选择高性能服务器和调整服务器参数;网络方面,有选择稳定网络环境和调整网络参数;RTMP播放器方面,选择专为直播场景打造的低延迟播放器,并调整播放器参数,以达到好的播放体验。以上是RTMP低延迟设计的一点心得,感兴趣的开发者,可以单独跟我探讨。