繁体   English   中英

ffmpeg/ffplay/libav:如何使用 SDP 文件播放多路复用的 RTP/RTCP stream?

[英]ffmpeg/ffplay/libav: how to play out a muxed RTP/RTCP stream using an SDP file?

我正在尝试使用 ffplay 播放传入的 RTP 音频 stream(或者,通过使用我自己的使用 libav 的代码)。 传入的 stream 正在复用 RTP 和 RTCP 数据包。 播出有效,但使用了两个本地 UDP 端口:

  1. 我请求的端口
  2. 我请求的端口 + 1(我猜是 RTCP 端口)

这是 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

请注意行a=rtcp-mux 即使存在这条线,也会使用两个本地 UDP 端口。 我希望这只是 1 个端口。

我正在寻找一种只使用一个 UDP 端口的方法。

这是相关的 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);

RTP 始终使用两个端口,RTP 流在偶数端口上,RTCP 控制流在下一个奇数端口上。

编辑: https://www.rfc-editor.org/rfc/rfc8035 RFC8035 阐明了如何在单个 IP 地址和端口上复用 RTP 和 RTCP,称为 RTP/RTCP 复用。

你走在正确的轨道上。 在深入研究所有这些 RFC 之后,我想最好的办法是检查 ffmpeg 的 RTP 堆栈是否实现了 rfc5761 esp。 第 4 节:

  1. 可区分的 RTP 和 RTCP 数据包

当 RTP 和 RTCP 数据包被多路复用到一个端口时,
RTCP数据包类型字段在数据包中占用相同的position作为
RTP 标记 (M) 位和 RTP 负载类型的组合
(PT)。 该字段可用于区分RTP和RTCP数据包
当遵守两个限制时:1) RTP 负载类型值
使用的与使用的 RTCP 数据包类型不同; 和 2) 对于每个
RTP payload type (PT), PT+128 与 RTCP 数据包类型不同
用过的。 第一个约束排除了 RTP 之间的直接冲突
有效负载类型和 RTCP 数据包类型; 第二个约束排除了
设置了标记位的 RTP 数据包与
RTCP数据包。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM