C++ FFmpeg怎么实现SRT超低延迟网络流协议传输

阿敏同学_6269

阿敏同学_6269

2026-10-21

875人浏览

原创

srt在ffmpeg中不能直接用ffmpeg -i拉流实现低延迟,因其默认启用加密与重传、未显式配置-srt_latency(如100ms)、-srt_mode及-srt_pkt_size等关键参数,且需强制指定-f mpegts封装、禁用缓冲(-fflags nobuffer+fastseek)并配合解码器低延迟选项,否则端到端延迟常超800ms。

c++ ffmpeg怎么实现srt超低延迟网络流协议传输

为什么 SRT 在 FFmpeg 里不能直接用 ffmpeg -i 拉流就自动低延迟

SRT 默认启用加密和重传机制,FFmpeg 的 libsrt 封装层若未显式关闭冗余保护、禁用加密、调小缓冲窗口,实际端到端延迟常卡在 800ms 以上——这不是网络问题,是协议栈默认行为。关键参数不在 URL 里,而在 AVDictionary 或命令行的 -srt_* 选项中。

  • -srt_latency 100:设为 100ms(单位毫秒),这是接收端最大允许的抖动缓冲,必须显式指定,否则走默认 120ms + 内部重传等待,叠加后远超预期
  • -srt_mode caller(推流)或 -srt_mode listener(拉流):不设会 fallback 到 rendezvous,触发双向握手+心跳,增加首次连接耗时
  • -srt_pkt_size 1316:匹配 UDP MTU(1500 - 20IP - 8UDP - 12SRT = 1460,但实测 1316 更稳),过大易丢包,过小则帧碎片化抬高开销

推流端如何避免 FFmpeg 把 H.264 编码器塞进 SRT 包导致花屏

FFmpeg 默认对 SRT 输出使用 flv muxer 封装,但 SRT 协议本身只传裸 AVPacket,不认 FLV header。若没强制指定 -f mpegts 或 -f mpegts -mpegts_m2ts_mode 1,接收端 ffplay 或自研解码器会因找不到 PAT/PMT 直接失败,报错类似 Invalid data found when processing input。

  • 正确推流命令示例:
    ffmpeg -re -i input.mp4 -c:v libx264 -b:v 2M -g 30 -keyint_min 30 -sc_threshold 0 -c:a aac -f mpegts "srt://127.0.0.1:6000?mode=caller&latency=100&pkt_size=1316"
  • 务必加 -f mpegts:SRT 不自带复用逻辑,必须靠 muxer 打包成 TS 流再送入 SRT socket
  • 不要用 -f flv 或 -f mp4:这些格式依赖文件头/索引,SRT 是纯 packet 流,无法承载
  • 若用硬件编码(如 h264_nvenc),需确认驱动支持 low-latency mode:-rc vbr_hq -rc-lookahead 0 -spatial-aq 0

拉流端 ffplay 为什么连上但画面卡住不动

常见原因是 SRT 接收窗口与解码器缓冲冲突。ffplay 默认启用音视频同步和内部队列(-autoexit 之外还有隐式 -probesize 和 -analyzeduration),而 SRT 的低延迟要求 packet 到达即解,不能等“足够数据”。错误现象是日志出现 Estimating duration from bitrate, this may be inaccurate 后静止。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 必须加 -fflags nobuffer+fastseek:禁用读缓冲,跳过格式探测阶段
  • 加 -flags low_delay 和 -framedrop:让解码器优先保实时性而非完整性
  • 完整拉流命令:
    ffplay -fflags nobuffer+fastseek -flags low_delay -framedrop -rtsp_transport tcp "srt://127.0.0.1:6000?mode=listener&latency=100"
  • 注意:URL 中的 latency=100 是 query 参数,对应 C API 的 srt_latency 字段,不是所有 FFmpeg 版本都支持;4.4+ 更稳定,低于 4.2 建议升级

C++ 调用 libavformat 推 SRT 流时,avformat_open_input 失败返回 -5

错误码 -5 是 AVERROR_IO,表面是 IO 错误,实际多因 SRT URL 解析失败或 libsrt 初始化异常。FFmpeg 4.3+ 对 SRT 的 error reporting 仍较弱,容易掩盖真实原因。

  • 先检查是否链接了 libsrt:pkg-config --modversion libsrt 应输出 ≥ 1.4.1;若未启用,configure 需加 --enable-libsrt
  • URL 必须带完整 scheme:"srt://192.168.1.100:6000?mode=caller&latency=100",缺 mode= 或拼错会静默失败
  • 设置字典前,确保 AVDictionary *opts = nullptr;,然后:
    av_dict_set(&opts, "mode", "caller", 0);
    av_dict_set(&opts, "latency", "100", 0);
    av_dict_set(&opts, "pkt_size", "1316", 0);
    avformat_open_input(&fmt_ctx, url, nullptr, &opts);
  • 别漏掉 av_dict_free(&opts):内存泄漏会导致后续连接失败,且错误表现和首次一样

真正难调的是网络路径上的中间设备——有些企业防火墙会重置 SRT 的 keepalive 包,表现为偶发断连且无错误日志。这种问题只能靠 srt-live-transmit 工具抓包比对 timestamp 字段,没法靠 FFmpeg 参数解决。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1019

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

406

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1409

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习