使用 Ices 和 Icecast 流式传输音频

作者:Brian Matherly

苏族帝国业余无线电俱乐部运营着一个频率为 146.895MHz 的中继器,呼号为 W0ZWY。每周二晚上,他们会利用这个中继器发布俱乐部公告。我喜欢在有空的时候收听,但有时公告开始时我还在上班,没法使用我的无线电。我找到了一种解决方案,使用 UHF/VHF 扫描仪、Linux、Ices 和 Icecast。通过在互联网上重播这些信号,我可以随时随地收听本地俱乐部中继器的内容。

调谐

第一步是找到一个可以调谐到 146.895MHz 并将模拟音频输出到声卡的 VHF 调谐器。我发现最经济实惠的方法是购买消费级的 UHF/VHF 扫描仪。扫描仪需要具有线路电平输出或耳机插孔。我发现线路电平输出很少见,但有很多扫描仪带有耳机插孔。我还想要一个带有数字调谐器的扫描仪,这样它就不会随着时间的推移而发生频率漂移。我在 eBay 上找到了一个 Radio Shack PRO-2050,价格约为 75 美元,它满足了我所有的要求。

我使用 F 转 BNC 适配器,将扫描仪的天线插孔连接到我家屋顶上的地面电视天线。效果很好,因为 146.895MHz 正好位于地面电视 6 频道和 7 频道之间。我花了一些时间尽可能地将静噪调高,这样在没有人发射信号时就不会有静电噪音。图 1 显示了我的扫描仪,音频线已插入耳机插孔。

Streaming Audio with Ices and Icecast

图 1. 连接了音频线的 Radio Shack 扫描仪

连接

为了将音频放到互联网上,首先必须对其进行编码。然后,可以将编码后的信息提供给互联网上的客户端进行流式传输。对于这些任务,Icecast 和 Ices 是绝佳的组合。Icecast 是一个媒体流程序,支持 Ogg Vorbis 或 MP3 流。它从一个或多个源接收编码的媒体,并使其可用于流式传输到多个客户端。Ices 是一个 Ogg Vorbis 音频编码器,可以很好地与 Icecast 配合使用。我选择 Ogg 是因为它是一种无专利和免版税的格式。许多播放器都可以解码 Ogg。Linux 上的 XMMS 和 Windows 上的 Winamp 是最常见的。如果您有兴趣使用 MP3 编码,请查看本文“资源”部分中的链接 LiveIce。

编码和流式传输任务可以在同一台机器上完成,但我选择在不同的机器上完成。这使得以后更容易添加更多源。此外,它还减轻了流媒体机器的一些处理负担。

对于编码计算机,我选择了一台 233MHz Pentium I 计算机,它已经多年未使用。我使用旧电脑扬声器套装附带的 3.5mm 转 3.5mm 音频线,将扫描仪的耳机插孔连接到声卡的线路输入插孔。我将网络接口连接到我的 LAN,并将 IP 地址设置为 192.168.1.21。

对于流媒体计算机,我选择使用我现有的路由器,它也充当 Web 服务器。我选择它的主要原因是我已经拥有它,并且它拥有我唯一的公共 IP 地址。这台计算机有两个网络接口。一个连接到我的有线调制解调器,并具有公共 IP 地址。另一个接口连接到我的 LAN,并具有私有 IP 地址 192.168.1.1。另一种实现此目的的方法是使用消费级有线/DSL 路由器,并将端口 8000 转发到流媒体计算机的 IP 地址。

图 2 显示了我的网络图,包括扫描仪、编码器、流媒体器和有线调制解调器。

Streaming Audio with Ices and Icecast

图 2. 网络图

Icecast 配置

我的流媒体计算机运行的是 Mandriva。Icecast 可以从 Mandriva 的 contrib RPM 仓库获得。一旦我添加了该仓库,安装 Icecast 就和输入以下命令一样简单urpmi icecast从命令提示符。如果您想从源代码安装,您可以从 Icecast 网站(请参阅“资源”)下载最新版本。只需单击下载链接,解压缩存档文件,然后运行熟悉的命令./configure; make; make install.

Icecast 配置文件是一个 XML 文件,通常位于 /etc/icecast.xml 中。我可以使用大多数默认设置,但我在此处重点介绍我所做的一些更改。

文件的 limits 部分允许您设置最大源流(编码器)数量以及可以同时连接到流媒体计算机的最大客户端数量。我的有线调制解调器的上传数据速率受到我的 ISP 的限制,为 256Kbps。因此,我需要限制最大客户端数量,以确保我不会用完所有上传带宽

<limits>
    <clients>10</clients>
    <sources>2</sources>
</limits>

authentication 部分是您指定用户名和密码的位置。source-password 是编码机器连接时使用的密码。relay-password 供中继使用,在我的配置中我没有使用中继。admin-user 和 admin-password 允许访问管理 Web 页面。为了安全起见,务必将所有密码从默认值更改

<authentication>
    <source-password>hackme</source-password>
    <relay-password>hackme</relay-password>
    <admin-user>admin</admin-user>
    <admin-password>hackme</admin-password>
</authentication>

hostname 用于让 Icecast 知道要附加到 Web 页面链接开头的地址

<hostname>example.com</hostname>

listen-socket 允许您设置 Icecast 监听的端口;8000 是默认端口

<listen-socket>
    <port>8000</port>
</listen-socket>

一旦配置文件准备就绪,您就可以通过运行 init 脚本来启动 Icecast/etc/init.d/icecast start。如果在启动期间有任何错误,请查看日志文件以进行调试。

Ices 配置

我的编码计算机也运行的是 Mandriva。由于这台机器仅以 233MHz 的频率和 64MB 的 RAM 运行,我决定进行最小化安装并移除窗口管理器。Ices 也可以从 contrib 仓库获得。因此,再次输入urpmi ices就是安装 Ices 所需的一切。但是,您可以从 Ices 网站(请参阅“资源”)下载最新版本。如果您想使用 Ogg,请确保使用 2.0 系列。它还需要安装 libshout。安装完成后,您可以解压缩存档文件并运行./configure; make; make install以完成所有安装。

Ices 配置文件也是一个 XML 文件。它通常存储在 /etc/ices.conf 中。

配置文件的开头有一些设置,用于指示 Ices 的运行方式。在初始设置期间更改这些设置可能会很有帮助,以便 Ices 在前台运行并将消息发送到控制台。这些消息对于调试初始设置中的问题非常有帮助。一旦一切设置并运行,请确保 Ices 在后台运行并将消息记录到文件中

<background>1</background>
<logpath>/var/log/ices</logpath>
<logfile>ices.log</logfile>
<loglevel>3</loglevel>
<consolelog>0</consolelog>

文件的其余部分位于 stream 部分下。您可以在此处配置特定于此音频流的设置。在 stream 部分中,metadata 部分是您指定有关流的信息的位置。此信息将显示在 Icecast Web 页面上

<metadata>
    <name>W0ZWY 146.895 MHz</name>
    <genre>Live</genre>
    <description>Live feed of the 
        W0ZWY repeater</description>
</metadata>

input 部分是定义音频实际来源的位置。有许多可能性,包括播放列表和脚本的选项。因为我想编码实时音频,所以我使用了 oss 模块。如果您的系统使用 ALSA 声卡系统而不是 OSS,请不要惊慌。ALSA 具有 OSS 兼容性,因此此模块可与 ALSA 和 OSS 一起使用。使用 device 参数指定从中获取数据的声卡设备。在大多数系统上,它将是 /dev/dsp。rate 参数以赫兹为单位指定数据的采样率。大多数设备使用 44100。使用 channels 参数指定可用于捕获的声道数。对于大多数设备,这将是 2(立体声)

<input>
    <module>oss</module>
    <param name='device'>/dev/dsp</param>
    <param name='rate'>44100</param>
    <param name='channels'>2</param>
</input>

instance 部分允许您指定此流的实例数。如果您想将流发送到多个服务器,或者如果您想拥有同一流的不同版本(具有不同的比特率),则可能需要多个实例。对于我的系统,我只需要一个实例。

instance 部分的第一部分是您指定流媒体服务器信息的位置。hostname 告诉 Ices 将数据发送到哪里。port 和 password 必须与您在 Icecast 配置文件中指定的值匹配。mount 选项指定流的名称。

encode 部分指定音频的编码方式。简单的方法是将采样率和声道设置为与上面的 input 部分匹配。但是,我的流不需要那么高的质量。因此,我使用了 downmix 和 resample 部分来告诉 Ices 将音频重新采样到 11127Hz 并将其下混到 1 个声道(单声道)。您可以使用两个选项来调整流的最终比特率:quality 和 nominal-bitrate。请注意,我注释掉了 nominal-bitrate 并将 quality 设置为 2

<instance>
    <hostname>192.168.1.1</hostname>
    <port>8000</port>
    <password>hackme</password>
    <mount>/146.895.ogg</mount>

    <encode>
        <quality>2</quality>
        <!--nominal-bitrate>32000</nominal-bitrate-->
        <samplerate>11127</samplerate>
        <channels>1</channels>
    </encode>

    <downmix>1</downmix>

    <resample>
        <in-rate>44100</in-rate>
        <out-rate>11127</out-rate>
    </resample>
</instance>

一旦配置文件准备就绪,请确保 Ices 有权通过 /dev/dsp 访问音频设备。Mandriva 创建了一个 audio 组,该组拥有 /dev/dsp 文件。它还在安装 ices 时创建了一个 ices 用户和组。我只需通过编辑 audio 组,将 ices 添加为 /etc/groups 文件中 audio 组的成员

audio:x:81:ices

最后,您可以通过运行 init 脚本来启动 Ices/etc/init.d/ices start。如果在启动期间有任何错误,请查看日志文件以进行调试。检查流媒体计算机上的 Icecast 日志文件也有助于调试问题。

一旦一切启动并运行,您就可以在配置文件中指定的端口上访问 Icecast 状态页面。图 3 显示了 Icecast 状态页面的示例。单击“单击收听”将启动您的音频播放器。

Streaming Audio with Ices and Icecast

图 3. Icecast 状态页面

微调

一旦我完成了所有设置并开始运行,我就花了很多时间微调音频。我首先发现的是音频电平非常低。通常,当我想要调高音频电平时,我会使用 KMix。但是,我没有在我的编码计算机上安装窗口管理器。我的系统使用 ALSA 作为声卡系统,我发现 ALSA 有一个很棒的基于 curses 的混音器,名为 Alsamixer。它允许您使用箭头键更改设置。图 4 显示了我为我的声卡选择的设置。我的最终偏好是将 Master 和 PCM 都设置为 100%。我还选择将其他所有内容都静音,因为我知道它们不会被使用。

Streaming Audio with Ices and Icecast

图 4. Alsamixer 设置

现在音频已经足够响亮,但我仍然有另一个问题。音频听起来断断续续的。在寻找了一段时间后,我意识到处理器使用率达到了 100%。我尝试通过更改 nominal-bitrate 设置的值来降低比特率。将比特率设置得足够低后,音频听起来不错。我想你不能用 233MHz 的处理器编码非常高质量的音频。

当音频听起来不错时,我的目标是在保持可接受的音频质量水平的同时,尽可能降低比特率。在我的情况下,“可接受水平”相当低。W0ZWY 中继器上的流量仅为语音,因为在业余无线电频段中传输音乐是违法的。

编码音频的三个方面会影响其质量和比特率:声道数、采样率和比特率。我首先将下混设置为 1,因为扫描仪只是单声道的。然后,我逐渐降低采样率,直到找到呈现可接受音频的最低设置;11127Hz 最终成为最小值。我没有使用 nominal-bitrate 设置来设置比特率,而是使用了 quality 设置。quality 设置直接影响最终比特率。经过几次尝试,我选择的质量级别为 2。

使用我的最终设置,比特率保持在 30Kbps 左右,处理器使用率徘徊在 40% 左右。

结论

可能还有许多其他应用场景可以使用这种类型的系统。但是请记住,如果您有兴趣将这种类型的系统用于流式传输音乐,请确保您已获得艺术家和录音室的许可。

开源项目的这种组合确实协同工作得很好。设置一切都非常简单。我大部分时间都花在了调整质量和采样率设置上。我的流媒体上的流量非常低。我通常每周只有一两个连接。但是,学习它很有趣,而且这是我参与业余无线电社区的一点点方式。

Ices 设置和比特率

质量、采样率和声道设置都会影响流的比特率。表 1 显示了这些设置的各种组合及其产生的比特率。

表 1. Ices 设置和比特率

 质量采样率声道比特率
低质量通话电台011127120Kbps
中等质量通话电台211127130Kbps
低质量音乐044100256Kbps
中等质量音乐244100284Kbps
高质量音乐4.5441002132Kbps

资源

Icecast 网站: www.icecast.org

Ices 网站: www.icecast.org/ices.php

LiveIce 网站: web.arm.ac.uk/~spm/software/liveice.html

Brian Matherly 是位于南达科他州苏福尔斯的 Sencore Electronics 的软件工程师。他还是科罗拉多技术大学的兼职教授。

加载 Disqus 评论