将多个 mp3 文件流式传输到 Icecast
Posted
技术标签:
【中文标题】将多个 mp3 文件流式传输到 Icecast【英文标题】:Streaming mulitple mp3 files to Icecast 【发布时间】:2014-02-04 11:49:56 【问题描述】:我在 Web 服务器上有几千个 mp3 文件,我需要将它们流式传输到同一台服务器上运行的 Icecast 2.3.3 服务器实例。
每个文件都被分配到一个或多个类别。共有7个类别。我希望每个类别有一个坐骑。
我需要能够在类别中添加和删除文件。添加/删除文件时,我需要以某种方式将文件合并到类别中或打乱类别中的文件,之后我假设我需要重新启动挂载。
我的问题是:我可以使用作为服务在 Windows 操作系统上运行的源应用程序来自动执行此类操作吗?
或者,我可以编写一个程序来将这些文件打乱并合并为一个大的“类别”mp3 文件,但想知道是否还有其他方法。
非常感谢任何建议。
【问题讨论】:
【参考方案1】:由于您只是处理 MP3 文件,因此 SHOUTcast sc_trans 可能是您的不错选择。
http://wiki.winamp.com/wiki/SHOUTcast_DNAS_Transcoder_2
您可以将其配置为使用播放列表(您可以通过编程方式生成),或者让它读取目录并按原样运行文件。请注意,sc_trans 不支持挂载点,因此您必须将 Icecast 配置为接受 SHOUTcast 样式的连接。这可行,但需要您运行多个 Icecast 实例。如果您以后想在单个端口上流式传输所有内容,您可以设置一个主 Icecast 实例,该实例中继来自其他端口的所有流。
根据您的需要,还有很多其他选择。 SAM DJ 之类的工具可以让您完全控制播放列表和广告,但根据您的需要,可能会有些过度。
我通常会发现自己使用不同的输入集,因此我使用 VLC 进行播放,然后使用一些自定义软件将其编码并传输到流服务器。这并不难做到,如果你在配置上很狡猾,你甚至可以使用 VLC 为你做编码。
【讨论】:
【参考方案2】:我知道它已经过时了,而且您很可能已经找到了解决方案。但是,可能会有更多人遇到此问题,因此当您决定为 MP3 文件编写自己的“洗牌器”时,我提出了一些注意事项。
我不会对手头的任务使用纯随机:标题连续播放多次的可能性是存在的;你不想要那个。
另外,你很可能以某种方式对标题进行了排序,比如
Artist A - Title 1
Artist A - Title 2
...
Artist B - Title 1
...
您最有可能在洗牌时追求多样性,因此您不想连续播放同一位艺术家两次。
我会将所有文件名读入索引为 0...n
的数组中。
找到文件数最多的艺术家,编号为m
。
然后找到下一个素数p
,它是n
的互素数,但大于m
。
在[0...n]
中生成一个伪随机数s
只需ONCE 即可找到起始歌曲;这样可以避免每次播放相同的开始序列。
循环播放歌曲s
,然后设置
s := (s + p) mod n
这保证播放所有歌曲,并且它们只会播放一次,并且避免了同一艺术家的多首连续歌曲。
这是一个只有 16 首歌曲的小例子,大写字母是 Artist,小写字母是歌曲标题。
Aa Ab Ac Ba Bb Bc Bd Ca C2 Da Db Dc Dd Ea Fa Fb
n 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
艺术家B
和E
的歌曲最多,因此
m := 4
您搜索与16 = 2 * 2 * 2 * 2
互质但大于4
的素数,您会发现:
p := 5
您调用一次 PRNG 函数并获得,比如说,11
,所以s = 11
是要播放的第一首歌曲 (s = 0
)。然后你循环:
Aa Ab Ac Ba Bb Bc Bd Ca Cb Da Db Dc Dd Ea Fa Fb
n 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
s 1 14 11 8 5 2 15 12 9 6 3 0 13 10 7 4
s 是播放的序列:
Dc Aa Bc Db Fb Bb Da Fa Ba Cb Ea Ac Ca Dd Ab Bd
没有艺术家重复,没有两首接二连三的歌曲,非常多样化。
【讨论】:
以上是关于将多个 mp3 文件流式传输到 Icecast的主要内容,如果未能解决你的问题,请参考以下文章
将 getUserMedia 流式传输到 Icecast 服务器?
通过 Yeti lame 包装器将音频流式传输到 mp3 文件