前言
晚上闲得蛋疼,打游戏又想听歌,想多设备同步同时播放,于是我就想要搭建属于我自己的专属电台。当然不一定得是真正的电台,我可没有这种许可证,自己搭建一个互联网的电台自己自娱自乐差不多得了。
整个架构稍微有一点点复杂,但是其实很简单。如果不是受虐狂非要挑战自己,没必要完全调通。
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