C/C++:流媒体 MP3

C/C++: Streaming MP3

在 C++ 程序中,我获得了多个 PCM 数据块,我目前正在使用 libmp3lame 将这些数据编码为 MP3 文件。 PCM块一个接一个产生。但是,我不想等到 PCM 数据流完成,而是想尽早将数据编码为多个 MP3 块,以便客户端可以播放或将这些片段附加在一起。

据我了解,MP3文件由帧组成,文件可以按帧拆分并单独发布。此外,没有预先需要的长度信息,因此该格式适合流式传输。但是,当我使用 libmp3lame 将部分数据生成 MP3 文件时,产品拼接在一起后无法被音频播放器解释。我停用了位库,因此,我希望帧是独立的。

基于this article,我写了一个Python脚本,从MP3文件中提取和列出帧。我通过首先收集整个 PCM 数据然后应用 libmp3lamelibmp3lame 生成了一个 MP3 文件。然后,我从这个文件中取出前 n 帧并将它们放入另一个文件中。但结果也无法播放。

如何只对音频的块进行编码,哪个库适合这个,块的最小大小是多少?

我检查了 lame 的源代码,文件 lame_main.c 帮助我找到了解决方案。此文件实现了 lame 命令行实用程序,它还可以对多个 wav 文件进行编码,因此它们可以无间隙地附加到单个 mp3 文件。

我的错误是每次调用 encode 函数时都初始化 lame,因此,为每个新段初始化 lame。这会导致输出 mp3 出现短暂中断。相反,初始化 lame 一次并将其重新用于后续调用已经解决了这个问题。此外,我在 encode 的开头调用 lame_init_bitstream 并适当地使用 lame_set_nocap_currentindexlame_set_nogap_total。现在,输出片段可以无缝组合了。