我有一个 AES67 设备网络,它们使用多播在广播环境中进行通信。我在一台有两个 NIC 的机器上运行 FFMPEG,一个专用于 AES67 网络,另一个面向本地 LAN。我有一个 SDP 文件,它定义了如何从 AES67 源接收数据,并且已知该文件可以正常工作。但是,FFMPEG 不知道向哪个接口发送 igmp“加入”请求以开始获取多播数据包,因此最终没有数据到达机器。
在 FFMPEG 中使用 RTP 输入时,您可以手动指定接口的本地地址,以便 FFMPEG 知道将多播组加入请求发送到何处,如下所示rtp://239.192.0.104:5004?localaddr=192.168.2.105
。如果我将其用作输入,FFMPEG 能够开始从 AES67 源接收多播数据包。但是,它会失败,并出现“无法在没有描述它的 SDP 文件的情况下接收 RTP 有效负载类型 xxx”错误,因为它不知道正在使用的协议类型。
我有一个 SDP 文件来描述该协议类型,但是一旦我将其用作 FFMPEG 的输入而不是 rtp 协议,我就无法提供“localaddr”参数来告诉它使用哪个 NIC 加入多播组。我需要的是一种类似的方法,在使用 SDP 文件时指定 NIC 的本地地址。
答案1
我最终发现有一个未记录的命令行选项localaddr
,适用于 RTSP 和 SDP 协议。它将实现与 RTP URI 中的“localaddr”参数相同的效果。这确实应该添加到文档,我最终不得不在源代码中寻找它。
这是可行的,例如:
ffmpeg.exe -protocol_whitelist file,udp,rtp -localaddr 192.168.2.105 -i '.\KPFX AIR@Node-01' test.wav
...然而这不会,因为它不知道用于请求加入多播组的 NIC 的本地地址:
ffmpeg.exe -protocol_whitelist file,udp,rtp -i '.\KPFX AIR@Node-01' test.wav