我正在尝试(在 NodeJS 中):
- 连接到 Icecast互联网音频流。例如:http://icecast3.977music.com/comedy
- 解析响应 header 并提取
icy-metaint
值。 - 将原始音频数据写入文件,同时从音频流中提取元数据字节,以便:
- 在元数据到达时拦截并解析元数据。
- 不在输出文件中包含元数据字节,这样就不会因注入(inject)元数据而出现音频失真。
遵循"unofficial" Shoutcast Metadata Protocol来自 SmackFu 的页面,我已经能够做到这一点:
https://gist.github.com/e7474421dcb25e011620
基本上,我能够在预期时提取元数据(要点中包含的流转储的最开始只有 1 个元数据事件)。这部分似乎工作正常。
问题在于,输出 MP3 文件在整个文件中具有明显的音频伪影,大概是在元数据字节到达时。但是,我肯定会提取这些元数据字节并且不将它们包含在输出文件中,所以这是奇怪的部分。
上面链接中的协议(protocol)文档没有说需要对输出文件执行任何其他操作,但显然我仍然做错了一些事情。有谁知道还需要对音频流做什么?预先感谢!
最佳答案
我能够在 Node.js IRC channel 上解决这个问题。我在输出的音频字节数中出现“off by 1”错误,因此导致音频文件无效。
OP 中发布的要点已得到更正,现在可以正常工作。
这个小练习的延续被打包到 Node.JS 模块中,以从 SHOUTcast/Icecast 流中读取音频和元数据。查看node-radio-stream如果你有兴趣。
关于audio - Icecast 元数据提取在输出音频数据中产生伪影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3687617/