我正在远程托管的 CentOS 机器上设置音频处理器。音频处理器本身是基于命令行的,在与作者交谈后,他向我解释说,它通过读取实时 .WAV 流来工作,并且它也会输出实时 .WAV。
现在基本上,我的情况是这样的:
我在这个盒子上有一个使用端口 8000 的shoutcast 服务器。这个shoutcast 服务器是DJ 的连接点。
我有一个辅助的shoutcast 服务器,使用端口8002,听众将连接到该端口。
在这些之间,我想使用这个音频处理工具。它需要连接到端口 8000 上的第一个shoutcast 服务器,处理音频,然后将其发送到端口 8002 上的服务器。
不幸的是,软件作者告诉我,该程序无法自行完成此操作。他还表示,只要我使用正确的方法,这种情况是可行的。他建议如下:
- 读取传入流并将其通过管道传输到的命令行工具:
- 将 MP3 数据提取为 WAV 格式的命令行工具,例如带有选项 --decode 的 lame。
- 立体声工具。
- 将 WAV 编码为 MP3 数据的程序,例如 lame。
- 流式传输的程序,可以将管道作为输入处理。
步骤 1+2 可以替换为:“arecord”,使用“jack”链接到接收和播放传入流的程序
类似地,步骤 5 可以替换为:“aplayer”,使用“jack”链接到流式传输音频数据的程序。
我确实理解他所说的,如果我使用带有 GUI 和声卡的本地安装,我可能可以做到这一点。
这主要是我所苦苦挣扎的输入和输出。
答案1
我以前没有这样做过,也没有测试过,也没有彻底阅读过相应的文档。我不是音频/视频编解码器之类的专家。因此,这更像是一个“这可行”的指南,希望其他人能够详细说明。
我在谷歌上进行了快速搜索,试图找到一些能够满足要求的工具(仅限命令行工具)。
- 从第一台服务器获取音频流:
icecream
- 从 mp3 解码为 wav:
lame
- 您的立体声工具:(
stereo_tool
假设) - 从 wav 到 mp3 的编码:
lame
- 将音频转发到第二个服务器:
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