You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自动驾驶卡车远程控制中FFmpeg多流合并后异步延迟问题求助

这个多路MJPEG RTP流合并的异步延迟问题我之前处理过不少,尤其是在自动驾驶这类对实时性要求极高的场景里,确实挺头疼的。先给你确认下:你提供的SDP里负载类型是26,这确实对应RTP的MJPEG流,这点没毛病。接下来我们一步步解决同步问题:

核心原因分析

多路流异步延迟主要来自这几个点:

  • MJPEG作为帧内编码格式,很多设备推流时可能不带精确的RTP时间戳,FFmpeg无法自动对齐
  • 不同输入流的默认缓冲大小不一致,导致某路流的帧被缓存堆积,慢慢拉开延迟
  • 滤镜处理时没有强制同步所有流的时间基准

具体解决方案

1. 统一输入流的缓冲与时间戳策略

给每个输入流添加强制生成时间戳、限制实时缓冲的参数,避免因缺失时间戳或缓冲堆积导致的延迟。修改后的基础命令如下:

ffmpeg -hide_banner \
  -protocol_whitelist "rtp,file,udp" -fflags +igndts+genpts -rtbufsize 1000k -i "cam1.sdp" \
  -protocol_whitelist "rtp,file,udp" -fflags +igndts+genpts -rtbufsize 1000k -i "cam2.sdp" \
  -protocol_whitelist "rtp,file,udp" -fflags +igndts+genpts -rtbufsize 1000k -i "cam3.sdp" \
  -filter_complex "[0:v][1:v][2:v]hstack=inputs=3:shortest=1[v]" \
  -map "[v]" \
  -c:v mjpeg -q:v 3 -f mjpeg rtp://your-output-ip:port

参数解释:

  • -fflags +igndts+genpts:忽略可能无效的DTS(解码时间戳),自动生成连续的PTS(显示时间戳),解决MJPEG流无时间戳的问题
  • -rtbufsize 1000k:限制每个输入的实时缓冲大小,避免帧堆积
  • shortest=1:让合并后的流跟随最短的输入流结束,防止某路流中断后其他流持续累积延迟

2. 强制对齐所有流的时间基准

如果上面的命令还是有延迟,给每个视频流添加时间戳重置,让所有流从同一时间起点开始计算:

ffmpeg -hide_banner \
  -protocol_whitelist "rtp,file,udp" -fflags +igndts+genpts -rtbufsize 1000k -i "cam1.sdp" \
  -protocol_whitelist "rtp,file,udp" -fflags +igndts+genpts -rtbufsize 1000k -i "cam2.sdp" \
  -protocol_whitelist "rtp,file,udp" -fflags +igndts+genpts -rtbufsize 1000k -i "cam3.sdp" \
  -filter_complex "
    [0:v]setpts=PTS-STARTPTS[v0];
    [1:v]setpts=PTS-STARTPTS[v1];
    [2:v]setpts=PTS-STARTPTS[v2];
    [v0][v1][v2]hstack=inputs=3:shortest=1[v]
  " \
  -map "[v]" \
  -c:v mjpeg -q:v 3 -f mjpeg rtp://your-output-ip:port

setpts=PTS-STARTPTS会把每个流的第一个帧时间戳设为0,后续帧按相对时间递增,确保三路流的时间线完全对齐。如果某路流还是有延迟,可以给该流加上async=1参数强制同步到主时钟,比如[1:v]async=1:setpts=PTS-STARTPTS[v1]。

3. 检查流本身的时间戳有效性

有时候问题出在摄像头推流端没生成正确的RTP时间戳,你可以用ffprobe验证:

ffprobe -protocol_whitelist "rtp,file,udp" -show_entries frame=pkt_pts_time cam1.sdp

如果输出的时间戳全为0或者不连续,说明流本身没有时间戳,这时候需要给每个输入加上-framerate参数强制指定帧率,让FFmpeg按固定间隔生成时间戳,比如在每个-i前加-framerate 30(根据你的摄像头实际帧率调整)。

4. 优化输出端的实时性

自动驾驶场景对延迟要求极高,输出时要避免使用高延迟编码器:

  • 如果合并后的流格式兼容,直接用-c:v copy复制视频流,跳过编码步骤,延迟最低
  • 必须编码的话,用硬件加速编码器比如mjpeg_qsv(Intel)或mjpeg_nvenc(NVIDIA),减少编码耗时
  • 添加-fflags nobuffer禁用输出缓冲,进一步降低端到端延迟

最后验证

修改命令后,你可以用ffplay实时查看输出流,观察三路画面的同步情况:

ffplay -protocol_whitelist "rtp,file,udp" rtp://your-output-ip:port

如果还有微小延迟,可以微调rtbufsize的大小(比如500k或2000k),找到最适合你网络环境的缓冲值。

内容的提问来源于stack exchange,提问作者Godmar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:00:09