我发现了一个关于此的问题,但没有完全解释我在超级用户上的问题(并且它的参考链接已失效...) 所以我提出了这个问题。
我需要通过 UDP 在 MPEG-TS 容器中传输视频 + 音频(目前忽略 RTSP)。
现在假设有两台计算机A(192.168.1.1
)&乙(192.168.1.2
)。根据几天的实验,我知道我可以使用:
A:
ffmpeg -re -i ./bunny.mp4 -codec copy -tune zerolatency -f mpegts udp://192.168.1.2:9999
乙:
vlc -v udp://@:9999
这确实很有效。但是,我就是无法理解这是什么@
意思。我无法在 duckduckgo/google 上找到这样一个该死的符号;尽管 VLC 的 UI 中有一个示例,但没有任何描述或解释:
经过更多实验后,我vlc -v udp://@:9999
发现乙不等同于:
vlc -v udp://:9999
vlc -v udp://127.0.0.1:9999
vlc -v udp://127.0.0.1@:9999
以上三种方法都不起作用。那么“@”到底是什么呢?
答案1
代表@
“我自己”——任何 UDP 地址。就你的情况而言,vlc -v udp://@192.168.1.2:9999
也可以。使用快捷方式的好处@
是,你不需要将你的 IP 地址硬编码到任何脚本等中。
这种@
捷径并非来自事物的“严格” IT 方面,而是来自广播世界,当然,网络在广播世界中被广泛使用,但与真正的 IT 世界相比,对它的理解却少得多。
编辑
让我进一步详细说明一下此快捷方式的使用:
224.225.226.227@:9999
意味着“任意接口上的多播 IP 224.225.226.227,我可以在端口 9999 上接收它”@192.168.169.170:9999
意味着“我的IP 192.168.169.170,端口 9999”[email protected]:9999
意味着“接口上的多播 IP 224.225.226.227我的IP 为 192.168.169.170,端口为 9999”@:9999
当然意味着“任何我的端口 9999 上的 IP”
重要的是,符号@
清楚地表明,我们谈论的是自己的接口,而不是发送者的接口。
答案2
VLC 现在有关于此主题的文档这里。
完整语法是:(
vlc -v udp://source_address@dest_address:port
你可以用 rtp 替换 udp)
如果目标地址是多播地址,则:
source_address
是您要加入的多播组的特定源主机地址。如果您的本地计算机具有 IGMPv3,则将发出源特定多播 (SSM) 加入。如果主机正在运行较低的 IGMP,则将加入该组,但如果流来自不同的源地址,VLC 将拒绝播放该流。
dest_address
是您要加入的多播组。如果您有多个网络接口(包括虚拟接口),则操作系统的接口指标将用于确定要侦听哪个接口。
port
是您要侦听的多播组的端口。
如果目标地址是单播地址,则:
source_address
是要播放的流的特定源主机地址。
dest_address
是要监听的本地接口的地址。如果有 2 个或更多单播流通过不同的目标 IP 地址进入本地计算机,但目标端口号相同,则此功能非常有用。这是让 vlc 知道您要播放哪个流的唯一方法。
port
是要播放的流的端口。
如果省略 3 个参数中的任何一个或全部,则:
source_address
默认为“任何地址”。
dest_address
默认为本地计算机网络接口地址。如果您有多个接口,它将根据端口号查找流,除非多个流使用相同的端口。
port
默认为 1234。
在您的示例中,vlc -v udp://@:9999
计算机 B 可以播放来自计算机 A 的流,因为 A 正在向 B 单播。省略源地址意味着 vlc 将接受任何源,而省略目标默认为您的本地接口(与环回 127.0.0.1 不同)。
注意:我在 Win10 上的 VLC 3.0.17.4 上测试了上述所有场景。