首页 > 解决方案 > C/C++:流式传输 MP3

问题描述

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

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

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

怎么可能只编码音频的块,哪个库适合这个,块的最小大小是多少?

标签: c++mp3audio-streaminglame

解决方案


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

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


推荐阅读