ffmpeg读取GStreamer生成流时时间戳不匹配导致播放异常问题
根因定位
你遇到的问题核心确实是GStreamer与OME的时间戳单位不匹配导致的:
GStreamer默认使用纳秒作为时间戳单位,而OME的媒体路由模块默认以1/1000的时间基(即毫秒单位)解析输入流的时间戳。从提供的日志可以看到,相邻两帧的pts差值约为4294967ms,换算后约为4294秒,远大于正常直播流的帧间隔,OME判定时间戳异常后无法正常组织帧序列发送给播放器,就会出现播放器仅能加载前1秒内容、后续卡顿无法播放的问题。
rtsp-simple-server可以正常播放的原因是它会自动适配输入流携带的时间基信息,不会强制将时间戳按毫秒解析,自然不会出现单位换算错误。
可行解决方案
- 推送侧修改(最优方案):在Brave的GStreamer推流链路中新增时间戳转换逻辑,将输出的PTS、DTS统一从纳秒除以1000转换为毫秒单位后再封装发送。如果你使用的是GStreamer标准封装sink组件,可以直接在sink前插入
capsfilter配置时间基为1/1000,GStreamer会自动完成时间戳单位转换,无需额外编码。 - 服务端配置修改:检查OME的输入流配置项,开启时间戳自动校正、时间基自适应功能,OME内置了针对不同输入源的时间戳对齐逻辑,开启后会自动识别输入流的时间基并转换为内部适配的单位,无需修改推送侧逻辑。
- 快速验证方案:你可以用ffmpeg中转一次推流验证问题,ffmpeg会自动处理时间基适配,命令参考:
ffmpeg -i <Brave输出的流地址> -c copy -f flv rtmp://<OME服务地址>/<应用名>/<流名>
如果中转后的流可以在OME上正常播放,即可完全确认是时间戳单位不匹配导致的问题。
内容的提问来源于stack exchange,提问作者Никель Виктор
相关产品推荐
相关产品推荐

