ffplay/libav播放复用RTP/RTCP流:SDP配置后仍双端口,求单端口方案
问题:RTP/RTCP复用音频流播放时占用双UDP端口,期望单端口复用
我使用ffplay或基于libav的自定义代码播放复用RTP/RTCP的音频流,播放功能正常,但会占用两个本地UDP端口:指定的端口以及该端口+1(推测为RTCP端口)。即使在SDP文件中添加了a=rtcp-mux字段,仍无法实现单端口复用,寻求解决方法。
使用的ffplay命令
ffplay -loglevel verbose -protocol_whitelist file,udp,rtp test.sdp
SDP文件内容
v=0 o=- 0 0 IN IP4 192.168.51.51 s=RTP-INPUT-1 c=IN IP4 192.168.51.61 t=0 0 m=audio 8006 RTP/AVP 97 b=AS:96 a=rtpmap:97 opus/48000/1 a=rtcp-mux
相关libav C++代码(省略错误处理)
auto formatContext = avformat_alloc_context(); const AVInputFormat* format = av_find_input_format("sdp"); AVDictionary *formatOpts = nullptr; av_dict_set(&formatOpts, "protocol_whitelist", "file,udp,rtp", 0); int result = avformat_open_input(&formatContext, sdpFilepath, format, &formatOpts); result = avformat_find_stream_info(formatContext, nullptr);
解决方法
1. 显式启用rtcp_mux参数
libav/FFmpeg默认不会强制启用RTCP复用,需要显式添加参数开启:
- ffplay命令行:增加
-rtcp_mux 1选项ffplay -loglevel verbose -protocol_whitelist file,udp,rtp -rtcp_mux 1 test.sdp - libav代码:在设置formatOpts时加入
rtcp_mux配置av_dict_set(&formatOpts, "protocol_whitelist", "file,udp,rtp", 0); av_dict_set(&formatOpts, "rtcp_mux", "1", 0); // 新增该行
2. 验证SDP属性的正确性
确保a=rtcp-mux属性位于对应媒体描述(m=audio行)的下方,和其他媒体属性(如a=rtpmap)同属一个媒体块,你的SDP文件中位置是正确的,若位置错误会导致复用逻辑不生效。
3. 升级libav/FFmpeg版本
旧版本的FFmpeg/libav对RTCP复用的支持存在缺陷,建议升级到4.4及以上的稳定版本,新版本对RTP/RTCP复用的兼容性和稳定性更好。
内容的提问来源于stack exchange,提问作者Roel
相关产品推荐
相关产品推荐

