RTSP/RTMP协议下GDR(帧内刷新)码流的播放兼容与转发实现

在实时远程控制、无人机 FPV(第一人称视角)图传以及机器人操控等极低延迟的场景中, 传统编码依赖定期发送的 IDR 帧(关键帧)来提供中途切入点,但由于关键帧体积大,会在无线信道中引发周期性的高瞬时码率突刺,导致严重的丢包、抖动以及画面花屏和卡顿等问题。

为了解决关键帧带来的传输不稳定性,目前业界部分无人机图传系统采用 GDR(Gradual Decoder Refresh,渐进式解码刷新)技术。GDR 模式在整个视频生命周期中取消了独立的常规关键帧,而是将帧内(Intra)宏块切碎平摊到连续的 P 帧中,如卷帘般规律地在多帧内完成整体画面的逐步重建。这种机制成功将波澜起伏的码率峰值削平,使码流在无线信道中呈现出一条近乎水平的平滑直线,增强了抗丢包性能。反正GDR理论上都是优势,建议结合具体场景实测.

针对GDR 码流"无常规独立关键帧"的特性,播放端与转发网关得建立一套完整的兼容性处理机制。实现兼容之前, 要先生成个GDR 视频源。正好NVIDIA Video Codec SDK支持,改下参数配置就好:

cpp 复制代码
encoder_config_.gopLength = NVENC_INFINITE_GOPLENGTH;

encoder_config_.encodeCodecConfig.h264Config.enableIntraRefresh = 1;

encoder_config_.encodeCodecConfig.h264Config.intraRefreshPeriod = gop();

encoder_config_.encodeCodecConfig.h264Config.intraRefreshCnt = gop();

改好代码后,再配置下采集端界面:

RTSP和RTMP视频源有了,再按规范改下播放端代码,RTMP改下FLV解析代码,RTSP也差不多方式改下, 下面是改好的Windows播放效果:

Windows系统无论是软解还是硬解,延时都不高。然而, 将录制下来的 GDR 视频文件放入 Windows 原生播放器播放时,前几秒进度条再走,画面是纯黑屏, 随后画面如卷帘般规律地刷出来.

Android 端用MediaCodec 硬解时, 有些设备可能不支持, 建议先验证过再定硬件, 或者用软解也行。 另外我观察到一个现象是如果硬解不支持,录下来的GDR MP4文件原生Android播放器也播不了.

另外RTSP转RTMP协议时不需要解码, 只要Android设备能跑的动协议转换代码就行.