Pulseaudio将RTP输出到Internet

Jus*_*tin 5 vlc alsa pulseaudio

我希望pulseaudio(远程实例)将通过互联网发送到主要alsa设备的音频直接发送到RTP,以便可以在家用计算机上的VLC上收听。

在我的/etc/pulse/default.pa中

load-module module-rtp-send source=alsa_output.0.analog-stereo.monitor destination=x.x.x.x port=8080 loop=1
Run Code Online (Sandbox Code Playgroud)

其中xxxx是我的服务器的Internet IP

启动pulseaudio后,netstat显示(我无法从远程VLC连接到此端口)

udp        0      0 10.170.94.16:58606      x.x.x.x:9875      ESTABLISHED 2109/pulseaudio
udp        0      0 10.170.94.16:35597      x.x.x.x:8080      ESTABLISHED 2109/pulseaudio
Run Code Online (Sandbox Code Playgroud)

它与cvlc一起使用可以产生预期的结果(我可以从remove VLC连接到此)

cvlc -vvv pulse://alsa_output.0.analog-stereo.monitor --sout '#transcode{acodec=mpga,ab=32,channels:1}:rtp{sdp=rtsp://0.0.0.0:8080/test.sdp}'
Run Code Online (Sandbox Code Playgroud)

产生

tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      1944/pulseaudio
Run Code Online (Sandbox Code Playgroud)

我可以连接到它。

因此,我认为我理解的是Pulseaudio正常工作,并且正在将音频发送到端口8080。但是,它不是在侦听将数据路由到的传入连接。当发生入站连接时,我该如何告诉Pulseaudio或设置路由,以便端口8080传输rtp提供的音频。我还看到cvlc使用rtsp作为源。

还是有点困惑。

sle*_*anc 0

RTP 使用无状态 UDP 协议作为传输:它不需要目的地端确认任何传入数据包。它无法告诉您连接是否实际上已建立,除非远程端明确拒绝它。此功能允许在 LAN 上进行广播,因为多个客户端可以根据需要侦听数据包,但它使调试单播连接稍微复杂一些。

当执行单播 UDP 时(就像您试图实现的那样),一旦它出现在 Internet 上,它就应该到达您的目的地。你有防火墙吗?除非您的计算机直接连接到调制解调器,否则您很可能至少具有网络地址转换,这将阻止数据包到达您的计算机。在网关/路由器配置中查找端口转发。

您可以使用 tcpdump 测试是否确实收到数据包。运行它时,您会看到来自其他连接的一些噪音,以及如下所示的数据包:

08:19:38.483895 IP y.y.y.y.zzzz > x.x.x.x:8080: UDP, length 1292
Run Code Online (Sandbox Code Playgroud)

另外,PulseAudio不使用RTSP,因此VLC只需要打开RTP流。只需输入rtp://0.0.0.0:8080即可。