搭建属于自己的互联网音乐电台

前言

晚上闲得蛋疼,打游戏又想听歌,想多设备同步同时播放,于是我就想要搭建属于我自己的专属电台。当然不一定得是真正的电台,我可没有这种许可证,自己搭建一个互联网的电台自己自娱自乐差不多得了。

整个架构稍微有一点点复杂,但是其实很简单。如果不是受虐狂非要挑战自己,没必要完全调通。

flowchart

A[icecast服务器]

B[ffmpeg命令行] --> |推流| A

C[vb-cable虚拟音频线] --> |录制dshow音频设备|B

D["osu!(lazer)"] --> |音频来源| C

D --> E[tosu] --> |json api| F

F[python脚本] --> |元数据同步| A

A --> |黄页发现|G[黄页服务器]

A --> |直接播放|Z[最终用户]

G --> |第三方客户端|V[VLC] --> Z

G --> |网页端搜索| Z

服务端设置

首先自己的服务器上安装icecast,这个可以根据前人的笔记获得搭建方法。

github.com

GitHub - aswild/icecast-notes: Notes and configuration advice for running the...

Notes and configuration advice for running the Icecast server beind nginx

最坑的是这个icecast不建议被nginx反代,要直接开放端口。不然推流会非常难受,可以浏览黄页发现大家都是http播放。

创建新的文件夹,使用docker-compose部署它。

mkdir -p icecast/logs

chmod 777 icecast/logs

git clone https://github.com/aswild/icecast-notes

vim docker-compose.yml

docker-compose.yml

services:

icecast:

build: ./icecast-notes/docker/

container_name: icecast

volumes:

- "./icecast/logs:/usr/var/log/icecast/"

ports:

- 8000:8000/tcp

environment:

- ICECAST_SOURCE_PASSWORD= #推流密码,必填,不填就是默认密码:hackme

- ICECAST_RELAY_PASSWRD= #中继密码,必填,不填就是默认密码:hackme

- ICECAST_ADMIN_PASSWORD= #管理密码,必填,不填就是默认密码:hackme

- ICECAST_ADMIN_EMAIL= #管理员的电子邮箱,选填,不填写将禁用黄页发现

- ICECAST_LOCATION=earth #服务器位置,选填

- ICECAST_HOSTNAME= #服务器主机名(网址),选填

- ICECAST_MAX_SOURCES=10 # 最高同时推流数量,选填

restart: unless-stopped

network_mode: bridge

启动服务器。

docker compose build

docker compose up -d

至此,服务端已经准备完毕,可以随时等待用户推流。

用户端(推流)

我选择直接截取电脑上的音频来源,当然用mixxx之类的专业软件来推流更加简单,但是我是受虐狂,能走弯路绝对不走直路,我最喜欢玩的游戏osu!上下载了4k+首歌曲,我自己随便听都听不完。

我只是举个例子,可以把osu!换成任何可以发出声音能听歌的软件。

调整系统音频输出设置

下载并安装vb-cable虚拟音频线,将osu!的声音单独传输到这个虚拟的声卡里面,不然ffmpeg会截取电脑的全部声音,直接百家争鸣。

右键电脑音量图标,进入声音设置,单独让软件播放声音到虚拟声卡。

屏幕截图1142×828 24.9 KB

安装ffmpeg命令行

打开命令窗口,使用如下命令安装ffmpeg到电脑上。

winget.exe install Gyan.FFmpeg.Shared

开始推流

此时已经完成了推流的全部准备,新建一个bat脚本。使用以下ffmpeg命令开始推流:

chcp 65001

ffmpeg.exe -thread_queue_size 1024 -f dshow -audio_buffer_size 1000 -i audio="音频设备的名称" -c:a libvorbis -ar 48000 -ac 2 -q:a 10 -ice_name "我是名称" -ice_description "我是描述" -ice_public 1 -ice_url "我是链接" -content_type audio/ogg -f ogg icecast://source:推流密码@服务器地址:端口/挂载点

pause

参数说明

-ice_name "我是名称"

-ice_description "我是描述"

-ice_public 1 #是否是公开流,不想发布自己的电台到黄页就设置为0

-ice_url "我是链接"

-tls #是否使用TLS

可以用下面的命令获取音频设备的名称,选择对应的虚拟声卡进行音频抓取。

ffmpeg.exe -list_devices true -f dshow -i device

# 示例输出

# [dshow @ 000001968fffb2c0] "Hi-Fi Cable Output (VB-Audio Hi-Fi Cable)" (audio)

# 推流时使用的命令应该如下

# ffmpeg.exe -f dshow -i audio="Hi-Fi Cable Output (VB-Audio Hi-Fi Cable)" ...

效果图

屏幕截图1108×1121 117 KB

至于元数据同步,我想应该也不会有人用osu!这个音乐游戏来推流的,碍于篇幅过大而且不适用与大多数用户,所以就一笔带过了。如果推流的客户端支持,正在播放会正常同步的。

进阶:发布到黄页服务器

可以在xiph他们的官方网站浏览所有的公开的使用icecast发布的网络电台。

dir.xiph.org

Xiph Directory (BETA) — Index

在容器内的/etc/icecast.xml下找到对应的设置项目解除注释,记住要在前文设置管理员邮箱,不然无法提交自己的电台到黄页服务器。

默认情况下这段设置是被注释的,也就是默认是禁用提交电台到黄页服务器的。

也要注意前方ffmpeg选项,要发布到黄页必须是公开流,如果临时不希望提交自己的电台到黄页,可以设置ffmpeg选项 -ice_public 0 来避免提交。

效果:

直接在黄页搜索名字,如果运气好说不定能在首页发现自己的电台。

屏幕截图1335×1084 55.3 KB

打开VLC,进入播放列表,点击Icecast Radio Directory,搜索自己的电台名字。

VLC1078×866 40.1 KB

最后,自娱自乐一下,我的电台:

不定时推流,欢迎来收听效果如何。

http://ice.kisume.de:8000/status.xsl