如何通过网络将音乐流式传输到多台计算机?

结果

我想要能够从一个房间走到另一个房间,听到同一首歌在播放。就像你在所有房间里收听收音机一样。

我想要这种效果,但我想听自己的音乐,这可行吗?

材料

  • Ubuntu 笔记本电脑。
  • Mac 电脑。

第一个选择

8个回答

是的,使用pulseaudio可以很容易地实现这一点。您需要安装并运行paprefs Install paprefs使您的音频设备在网络上可用。

enter image description here

enter image description here

这些设置允许声音源和接收器通过网络发布,最理想的情况是发布到另一个pulseaudio服务器。
如果您的服务器没有桌面管理器,您需要先安装一个声音系统(参见this question)。然后您可以编辑/etc/pulse/default.pa,取消注释网络访问部分中的这些行。
load-module module-esound-protocol-tcp
load-module module-native-protocol-tcp
load-module module-zeroconf-publish

如果你想使用RTP发送器,请取消注释以下行,即在RTP发送器模块部分:
load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 description="RTP Multicast Sink"
load-module module-rtp-send source=rtp.monitor

如果pulseaudio服务器尚未运行,需要使用pulseaudio -D命令将其作为守护进程启动。为了优化声音质量设置,可以根据个人需求调整/etc/pulse/daemon.conf文件。

在您的网络中,另一种流式传输音频的方法是设置Icecast服务器(参见this question)。


16如果有一个无头客户端(比如,一个带有扬声器的树莓派放在我的厨房橱柜上),了解如何通过配置文件和/或Shell命令完全设置它将会非常有用。 - Raphael
这个指南足够通用,可以在Ubuntu的命令行界面上进行操作。 https://wiki.archlinux.org/index.php/PulseAudio/Examples#PulseAudio_over_network - goetz
如果你选择无头模式,你需要安装dbus-x11,就像这位朋友所说的: https://manurevah.com/blah/en/p/PulseAudio-Sound-over-the-network - greengold

我不需要做任何特别的事情。我有两台双子笔记本电脑,都配备了PulseAudio和相对无名的英特尔硬件。我设置它们的方式大致如下。
在服务器和客户端上运行paprefs。在服务器上,确保启用了多播设置,并勾选了服务器位,就像这样: enter image description here 还有多播位 enter image description here 在客户端上,启用关于查找网络设备的选项 enter image description here 并通过pavucontrol将输出设备设置为虚拟网络设备 enter image description here 现在你应该有一些魔法了

2除了这与RTP无关。 - kirelagin
1非常感谢这个很棒的教程。我已经勾选了所有的选项,除了我无法通过pavucontrol将输出设备设置为虚拟网络设备。据我所知,在你的截图中有一个按钮,上面写着"Internal Audio Analog Stereo on charmes@nano",应该是在那里完成这个操作。但是在我的系统中,根本就没有这样的按钮。我做错了什么? - user69748
自2011年以来,我没有检查过这些说明,所以脉冲音频守护程序的设置很可能已经发生了变化。 - lazyPower
我现在拥有的(重新启动后)是一个名为“pulseaudio”的单独通道,似乎被路由到我的客户端。但是,它没有任何音频通过。而我的Rhythmbox通道仍然没有提到“user@client”。 - user69748

你最好的选择是名为音乐播放器守护进程(mpd)。

https://secure.wikimedia.org/wikipedia/en/wiki/Music_Player_Daemon

这是一个客户端服务器应用程序。您将音乐存储在服务器上,然后与客户端连接(许多人可以同时进行连接)并控制服务器。

它已经在Ubuntu中了,只需使用apt-get install mpd命令安装。

还有一些很好的文档: https://wiki.archlinux.org/index.php/Mpd

MPD可以流式传输音乐,因此您可以拥有许多客户端(或扬声器,如果您愿意这样称呼它们)来播放音乐。

但不要对音质抱太大期望。流媒体会严重损坏声音(无论您使用的是mpd还是pulseaudio)。最好的做法是将真正的扬声器连接到服务器上,仅使用笔记本电脑对其进行控制。


2我的房子太大了,用电线不方便,所以我想要通过流媒体来传输声音。 - Alvar
你可以串流,不必担心质量,它不会有太大影响,只要你的无线网络连接足够稳定。 - Rahul Prasad
流媒体如何影响音质?WiFi是一种数字传输介质。MPD是否支持无损压缩?我认为对于今天的WiFi网络来说,这并不是必需的。 - nvd
哇,这个回答太老了。我都记不清了,因为自从那时候以来我就没再用过MPD。 - loxs

使用此解决方案,您可以在任何地方流式传输系统音频。
关键在于 ALSA 的回环功能。因此,首先需要在 ALSA 中启用回环设备,它将出现在 PulseAudio 音量控制中作为输入设备(以及输出设备)。
sudo modprobe snd_aloop

这个设备可以添加到一个MPD服务器上。
mpc add alsa://hw:1,1

在hw:1,1是回环输入设备的情况下,可以使用命令“aplay -l”列出。
然后,您需要为mpd配置一个http输出插件。以下示例将类似于“/etc/mpd.conf”。
 audio_output {
    type            "httpd"
    name            "My HTTP Stream"
    encoder         "vorbis"          # optional, vorbis or lame
    port            "8000"
    bind_to_address "192.168.1.38"               # optional, IPv4 or IPv6
    quality         "5.0"                   # do not define if bitrate is d$
#   bitrate         "128"                   # do not define if quality is d$
    format          "44100:16:1"
    max_clients     "0"                     # optional 0=no limit
 }  

就是这样。在音量控制播放选项卡中选择您的音频源的回环设备。
最后,您可以使用VLC或任何其他流渲染器,在目标点使用httpd url地址:http://192.168.1.38:8000
此答案也可在此处找到。


除了lazyPower的回答之外,我想评论一下,“pulseaudio服务器”是音频设备所在的地方(在我的情况下,它是连接到笔记本电脑的蓝牙耳机),而“pulseaudio客户端”是将音频播放到网络并选择音频接收设备的地方。我花了几个小时才意识到这一点。

这并没有回答问题。一旦你拥有足够的声望,你就可以评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自审核 - cocomac


2不推荐使用DLNA,因为它无法实现播放同步。 - Sparhawk

目前还没有好的解决方案。虽然有AVB,但它对802.11的支持仅限于时间同步。

如果你想要在安卓手机上进行流媒体播放,你可以在服务器上使用Foobar2000,并在客户端上使用BubbleUPnP(付费软件)。
  1. 买酒
  2. 获取 foobar_v1.2.5.exe
  3. $ wine foobar2000_v1.2.5.exe
  4. 下一步,下一步,下一步... :)
  5. 获取foo_upnp
  6. 将其解压到 foobar2000 的 components 文件夹中(该文件夹可能位于 ~/.wine/drive_c/Program Files/
  7. 启动 foobar2000
  8. 进入 Library→Configure→Playback→Output→Device,并选择 "Null output"
  9. 确保 ufw 没有阻止相关流量
  10. 在 BubbleUPnP 中:
    1. 进入 Devices→Libraries 并选择 foobar2000 服务器
    2. 在 "Library" 中选择 "Playback Stream Capture"

这种方法的优点是,如果在 Android 上暂停,它会积累一个缓冲区(因为服务器仍在发送数据)。

在Ubuntu(Wine版本1.5.28-0ubuntu1~ppa1)和Windows上进行了测试。