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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:35:18