几个月前,我用Java语言编写了一个自己的流源客户端,用于将播放列表流式传输到您的Icecast2服务器。逻辑很简单:您有多个“频道”,每个频道都有一个播放列表(在本例中是一个充满mp3文件的文件夹)。在频道启动后,它通过挑选第一首歌曲开始流式传输,并通过http将其流式传输到icecast2服务器。如你所想,一首歌结束后,下一首歌就被选中了。
下面是我目前用来向icecast发送音频的代码:
https://gist.github.com/z3ttee/e40f89b80af16715efa427ace43ed0b4
我想要实现的是实现两首歌曲之间的交叉淡入淡出。因此,当一首歌结束时,它应该同时淡出和淡入下一首歌。
当涉及到在java中处理音频时,我还是个新手。我所知道的是,我必须修改音频发送到icecast的方式。但问题是:我不知道如何开始,也不知道从哪里开始。
如果你有任何想法从哪里开始或者如何开始,请随时分享你的经验。
提前谢谢你!
发布于 2021-02-20 01:11:57
我认为对于交叉淡入淡出,您可能必须使用一个在PCM级别处理音频的库。如果您希望编写自己的混音器,基本步骤如下:
>G29
线性的交叉衰落(例如,音频数据)乘以从0到1线性递增的步长,反之亦然(例如,0.1,0.2,0.3,...)将倾向于离开中点比单独运行开始或结束轨道时更安静。通常使用正弦函数来保持和的音量稳定。
据我所知,有两个库可能对混合有帮助,但可能需要进行一些修改。一个是TinySound,另一个是AudioCue (我写的)。AudioCue所需的修改可能相对容易一些。混合器的输出被封装在类AudioMixerPlayer中,该类位于AudioMixer.java的第268行。一种可能的计划是修改此代码的输出行,用您的广播行替换SourceDataLine。
我要补充的是,要播放的歌曲将首先加载到AudioCue类中,然后该类将公开实时音量控制功能。但是可能有必要修改发出卷命令的方式。
我真的对这项工作很感兴趣,可以提供一些帮助。我现在正在参与Socket和SocketServer的项目,并想获得一些实践与流式音频。
https://stackoverflow.com/questions/66264637
复制相似问题