从网络广播中读取音频流数据并将其推送到临时文件

从网络广播中读取音频流数据并将其推送到临时文件

我正在远程托管的 CentOS 机器上设置音频处理器。音频处理器本身是基于命令行的,在与作者交谈后,他向我解释说,它通过读取实时 .WAV 流来工作,并且它也会输出实时 .WAV。

现在基本上,我的情况是这样的:

我在这个盒子上有一个使用端口 8000 的shoutcast 服务器。这个shoutcast 服务器是DJ 的连接点。

我有一个辅助的shoutcast 服务器,使用端口8002,听众将连接到该端口。

在这些之间,我想使用这个音频处理工具。它需要连接到端口 8000 上的第一个shoutcast 服务器,处理音频,然后将其发送到端口 8002 上的服务器。

不幸的是,软件作者告诉我,该程序无法自行完成此操作。他还表示,只要我使用正确的方法,这种情况是可行的。他建议如下:

  1. 读取传入流并将其通过管道传输到的命令行工具:
  2. 将 MP3 数据提取为 WAV 格式的命令行工具,例如带有选项 --decode 的 lame。
  3. 立体声工具。
  4. 将 WAV 编码为 MP3 数据的程序,例如 lame。
  5. 流式传输的程序,可以将管道作为输入处理。

步骤 1+2 可以替换为:“arecord”,使用“jack”链接到接收和播放传入流的程序

类似地,步骤 5 可以替换为:“aplayer”,使用“jack”链接到流式传输音频数据的程序。

我确实理解他所说的,如果我使用带有 GUI 和声卡的本地安装,我可能可以做到这一点。

这主要是我所苦苦挣扎的输入和输出。

答案1

我以前没有这样做过,也没有测试过,也没有彻底阅读过相应的文档。我不是音频/视频编解码器之类的专家。因此,这更像是一个“这可行”的指南,希望其他人能够详细说明。

我在谷歌上进行了快速搜索,试图找到一些能够满足要求的工具(仅限命令行工具)。

  1. 从第一台服务器获取音频流:icecream
  2. 从 mp3 解码为 wav:lame
  3. 您的立体声工具:(stereo_tool假设)
  4. 从 wav 到 mp3 的编码:lame
  5. 将音频转发到第二个服务器:ezstream

假设您的shoutcast 服务器已在同一个盒子中启动并运行。我们将创建一个 shell 脚本stream2stream.sh,该脚本将从第一个脚本读取、处理并转发到第二个脚本。

$ chmod 750 stream2stream.sh
$ cat stream2stream.sh
#!/bin/bash

icecream --stdout http://localhost:8000 | \
lame -decode - - | \
stereo_tool | \
lame --preset cbr 128 -r -s 44.1 --bitwidth 16 - - | \
ezstream -c ~/ezstream.xml

请注意,ezstream通过让您定义自己的编码/解码程序来支持重新编码。所以我上面的脚本可能是不必要的,并且ezstream本身就足够了。但我不熟悉这个工具,所以在这个实现中我们有最简单的配置。

$ cat ~/ezstream.xml
<ezstream>
    <url>http://localhost:8002</url>
    <sourcepassword>hackme</sourcepassword>
    <format>MP3</format>
    <filename>stdin</filename>
    <stream_once>1</stream_once>

    <svrinfoname>My Stream</svrinfoname>
    <svrinfourl>http://yoursiteurl/</svrinfourl>
    <svrinfogenre>YourGenre</svrinfogenre>
    <svrinfodescription>This is a stream description</svrinfodescription>
    <svrinfobitrate>128</svrinfobitrate>
    <svrinfoquality>2.0</svrinfoquality>
    <svrinfochannels>2</svrinfochannels>
    <svrinfosamplerate>44100</svrinfosamplerate>
    <!-- Disallow the server to advertise the stream on a public YP directory: -->
    <svrinfopublic>0</svrinfopublic>
</ezstream>

您必须根据自己的喜好调整 lame 和 ezstream 上的参数。您可以使用 nohup 或在 screen 中执行脚本。

screen -AmdS stereotool stream2stream.sh

相关内容