如何强制FFmpeg作为RTSP代理时仅输出TCP协议RTSP流而非默认UDP
强制FFmpeg输出TCP协议RTSP流的解决方法
命令行场景修复
你当前使用的命令存在3个核心问题,是导致未按预期监听TCP端口、自动开启UDP端口的原因:
- 输出RTSP地址拼写错误:你使用的
rtsp:/192.168.0.100:50041/少了一个斜杠,标准RTSP地址格式为rtsp://IP:端口/路径 - 缺少RTSP服务端监听参数:原生FFmpeg的
-f rtsp输出默认是推流客户端模式,会主动向指定地址发起推流请求,而非监听端口等待下游拉流。需要添加-rtsp_flags listen参数开启服务端监听模式 - 输入参数位置有误:
-rtsp_transport tcp作为输入源的参数需要放在输入地址-i之前,才能作用于输入链路
修正后可正常输出TCP协议RTSP流的命令如下:
ffmpeg -re -rtsp_transport tcp -i rtsp://adminassord@rtsp.source:554/live.sdp -f rtsp -rtsp_transport tcp -rtsp_flags listen rtsp://192.168.0.100:50041/
输出侧参数说明:
-f rtsp:指定输出封装格式为RTSP-rtsp_transport tcp:强制输出RTSP流的传输层使用TCP协议,替换默认的UDP协议-rtsp_flags listen:开启RTSP服务端监听模式,会在指定的50041端口启动TCP监听,等待拉流客户端连接
如果你的使用场景是将流推给已部署的RTSP服务器(如SRS、ZLMediaKit),不需要添加-rtsp_flags listen参数,直接填写对应服务的推流地址即可,输出传输层仍会走TCP协议。
API调用场景实现
如果你是基于FFmpeg原生API二次开发,对应网友提到的avformat_write_header配置逻辑如下:
- 初始化输出格式上下文
ofmt_ctx后,创建AVDictionary类型的配置参数集合 - 向配置集合中添加两个键值对:
- 键为
rtsp_transport,值为tcp - 键为
rtsp_flags,值为listen(仅服务端监听场景需要,推流到第三方服务无需添加)
- 键为
- 调用
avformat_write_header(ofmt_ctx, &options)时传入配置好的参数集合即可,配置逻辑和命令行参数完全对应。
内容的提问来源于stack exchange,提问作者Barabba
相关产品推荐
相关产品推荐

