使用icecast搭建一个网络电台的指北


在今年年初的时候了解到许多游戏都有电台功能——不是游戏内置的那种模拟电台(例子:GTA,虽然我从来没玩过GTA就是了),而是能连上真正的网络广播的那种电台机制。

这方面典型的游戏就是《欧洲卡车模拟器》、《模拟农场》。这也很容易理解,毕竟这些都是休闲游戏,在不紧不慢地开车、种田之余,听听广播什么的也是很常见的娱乐活动。这两个游戏都有默认的几个电台链接,只不过,由于游戏是国外开发的,里面配置的几个电台也都是国外的电台。

既然有电台机制,那又怎么会有不让玩家自定义听哪些电台的道理呢?只要配置一下、添加几个网络电台的网址,就可以听到你随便想听的什么电台。也因为这个原因,我听了好几十期的……浙江交通之声小崔热线。

这里放一个中国广播网址大全:

https://blog.csdn.net/qq_44929301/article/details/89350231

https://blog.csdn.net/aminfo/article/details/7646887

这些都不谈了,总而言之,我觉得平时和人联机玩休闲游戏(比如Minecraft、Minecraft还有Minecraft)的时候,也可以放放广播啥的。

虽然曾经尝试过用网易云音乐的分享耳机功能,但网易云的局限性还是太大了,连播客和本地文件都不能放。

那么,一个能够自定义的网络广播就呼之欲出了——在现在这个不管是论坛、微博,还是直播平台、电商平台都有开源代码还能够一键部署的时代,一个自己搭建的自定义电台也不奇怪吧?

本文将会讲述从服务器安装ubuntu 20.04 系统镜像安装好开始,到能够从浏览器听到自己放的广播为止的操作流程。不会涉及搭建HTTPS服务器的内容。

本次电台搭建最终要达到的效果是,我能够自由控制电台的开关与播放的文件,并且控制播放,最终做到与所有连接到电台的人同步收听。这差不多是我能在玩游戏的时候和别人一起愉快地听电台的最低需求。

那么首先介绍本文的主角,我使用的流媒体传输服务端软件:icecast,选择它的原因很简单,那就是开源免费文档完备,还有较多的教程。虽然本文不会涉及,但是它还有比较高级的特性,比如视频流传输、TLS / SSL加密,是一个比较好的自主搭建电台的解决方案(做HTTPS传输也就是一个nginx反向代理 + 添加SSL证书能解决的事情,我不做只是懒的同时还穷而已)。

那么假设你已经拥有了一台能够访问并且有公网IP的服务器,安装好了Ubuntu 20.04 LTS的镜像(18.04应该也适用于本指南)。

首先更新软件:

$ sudo apt update
$ sudo apt upgrade

然后安装icecast

$ sudo apt install icecast

在这个阶段,icecast会要求你输入三个密码:source密码、relay密码、admin密码。你自己设置一下就行,而且要记住。我们这个教程只会在推流的时候需要使用source密码,连admin密码都不会用到。而且,本教程最终搭建的服务器是使用明文传输的,密码也没有什么意义不是吗……

**我不曾认为这个阶段会发生问题,直到我往密码设置里输入了一个 ‘<’ 符号。**icecast会直接将你输入的密码不做任何加密的存放到一个XML文件里,因此如果你的密码包含‘<’或者‘>’符号,那么你就相当于对自己做了一个注入攻击,导致你的icecast服务无法正常启动,所以这一点还请注意。

安装好以后,打开/etc/icecast2/icecast.xml文件。(如果你没有安装vim,就自己用apt install安装吧)(我应该不需要连vim的使用方法都教吧)。

$ sudo vim /etc/icecast2/icecast.xml

这就是上文说的那个XML文件,是icecast的配置文件。

其中值得注意的几行如下:

存放你的主机名(本教程不需要,你随便配置都可以):

    <!-- This is the hostname other people will use to connect to your server.
         It affects mainly the urls generated by Icecast for playlists and yp
         listings. You MUST configure it properly for YP listings to work!
    -->
    <hostname>wahtever.example.com</hostname>

你希望icecast监听的端口号。默认为8000,你可以随便改到一个没有被占用的端口,比如8001、6677、998啥的,但你要记住你填了啥。

<!-- You may have multiple <listen-socket> elements -->
    <listen-socket>
        <port>8000</port>
        <!-- <bind-address>127.0.0.1</bind-address> -->
        <!-- <shoutcast-mount>/stream</shoutcast-mount> -->
    </listen-socket>

这个本教程也不需要填,但既然挺重要的也还是提一下。很多教程都让你修改这玩意儿,毕竟和安全有关,不过实际上不改可以运行。好奇怎么设置的话,可以去查查别的教程(不过你既然都在意安全了,怎么会看这个教程教你明文传输呢)。

    <security>
        <chroot>0</chroot>
        <!--
        <changeowner>
            <user>nobody</user>
            <group>nothing</group>
        </changeowner>
                -->
    </security>

保存并退出vim,启动icecast2服务(你可能还需要重启服务器)。

$ service restart icecast2

确认一下icecast2服务启动了。

$ service --status-all

这个时候,你访问一下http://服务器的IP:你指定的Port ,你就能看到icecast的控制面板了,或者看看/var/log/icecast2文件下的日志,确认服务启动状况。如果你没看到这些东西,检查一下你是不是把XML文件格式给破坏了。

服务端准备好了。接下来就要从本地推流。这里使用音频推流软件https://sourceforge.net/projects/butt/。同样,这个软件也是开源免费的,你也可以去支持一下这个软件。

下载后安装启动。点击Settings,Main菜单添加Server。Type选择Icecast,Address和Port填入IP和端口号,Password填入你的source密码,iceCast user填入source,iceCast mounpoint填入一个随便什么名字,以填入stream为例,在开始推流后你访问http://你的IP:端口/stream就可以收听广播了。

在开始推流之前,可以在本地用你喜欢的播放器随便放点音乐,观察一下butt主面板上有没有显示出波形。如果没有,进入Settings,Audio菜单下调整Audio Device为你使用的设备,比如想广播你自己的声音就选择你的麦克风,想广播你在听的音乐,就选择你的耳机或者音响。

设置好之后,点击butt主面上的播放按钮,就可以与服务器建立连接,把你的音频推流到服务器上了,浏览器打开http://你的IP:端口/stream,就能直接收听到你的声音。

但是这个时候你会发现这么几个问题:

  1. 广播有非常大的延迟,你本地的声音可能会过10秒才能从浏览器收听到。

    这个问题是没办法解决的——因为网络电台本就不是为了低延迟直播而准备的。

  2. 如果你推送的是你的声音输出设备(比如耳机或者音响)中的声音,那么你浏览器中听到的声音会被再次从本地推流到服务器上,然后再收回来,循环往复几次,你就会被自己的声音淹没。

这样子可没办法与朋友愉快地一起听电台——你如果不开浏览器,你和你的朋友之间会有十秒以上的延迟;你如果开浏览器,你就会制造出音频广播的回环。除非你有两台电脑,这个问题大概会让你头疼一会儿。

我就是那个有两台电脑的人,但是我还是决定找出在同一台电脑上推流与收听的方法,解决方案也是比较容易想到的,那就是构造虚拟音频设备。

这里为你介绍强大的Voice Meeter,虽然这个软件其实是一个专业的音频加工处理软件,但我们这里要使用它提供的几个虚拟音频设备。安装这个软件并且重启电脑后,你会发现你电脑的音频输出和音频输入设备列表里多了几个名字,比如VB-Audio VoiceMeeter VAIO。你可以打开一个播放器,它应该会有调整自己的输出到哪个音频设备的功能(比如Pot Player,在左上角下拉菜单,声音 - 默认声音输出设备里选择)。在butt调整Audio Device和你的播放器选择的虚拟音频设备保持一致,你就会发现,虽然你的播放器打开了,butt也能接收到波形,但是你却无法听到任何声音 —— 完美,不是吗。这时你再打开推流,浏览器打开网址,你就能完美地听到自己播放的(延迟了十秒)的音乐了。

至此教程结束。