C/C++:流媒体 MP3
C/C++: Streaming MP3
在 C++ 程序中,我获得了多个 PCM 数据块,我目前正在使用 libmp3lame
将这些数据编码为 MP3 文件。 PCM块一个接一个产生。但是,我不想等到 PCM 数据流完成,而是想尽早将数据编码为多个 MP3 块,以便客户端可以播放或将这些片段附加在一起。
据我了解,MP3文件由帧组成,文件可以按帧拆分并单独发布。此外,没有预先需要的长度信息,因此该格式适合流式传输。但是,当我使用 libmp3lame
将部分数据生成 MP3 文件时,产品拼接在一起后无法被音频播放器解释。我停用了位库,因此,我希望帧是独立的。
基于this article,我写了一个Python脚本,从MP3文件中提取和列出帧。我通过首先收集整个 PCM 数据然后应用 libmp3lame
用 libmp3lame
生成了一个 MP3 文件。然后,我从这个文件中取出前 n 帧并将它们放入另一个文件中。但结果也无法播放。
如何只对音频的块进行编码,哪个库适合这个,块的最小大小是多少?
我检查了 lame 的源代码,文件 lame_main.c
帮助我找到了解决方案。此文件实现了 lame 命令行实用程序,它还可以对多个 wav 文件进行编码,因此它们可以无间隙地附加到单个 mp3 文件。
我的错误是每次调用 encode
函数时都初始化 lame,因此,为每个新段初始化 lame。这会导致输出 mp3 出现短暂中断。相反,初始化 lame 一次并将其重新用于后续调用已经解决了这个问题。此外,我在 encode
的开头调用 lame_init_bitstream
并适当地使用 lame_set_nocap_currentindex
和 lame_set_nogap_total
。现在,输出片段可以无缝组合了。
在 C++ 程序中,我获得了多个 PCM 数据块,我目前正在使用 libmp3lame
将这些数据编码为 MP3 文件。 PCM块一个接一个产生。但是,我不想等到 PCM 数据流完成,而是想尽早将数据编码为多个 MP3 块,以便客户端可以播放或将这些片段附加在一起。
据我了解,MP3文件由帧组成,文件可以按帧拆分并单独发布。此外,没有预先需要的长度信息,因此该格式适合流式传输。但是,当我使用 libmp3lame
将部分数据生成 MP3 文件时,产品拼接在一起后无法被音频播放器解释。我停用了位库,因此,我希望帧是独立的。
基于this article,我写了一个Python脚本,从MP3文件中提取和列出帧。我通过首先收集整个 PCM 数据然后应用 libmp3lame
用 libmp3lame
生成了一个 MP3 文件。然后,我从这个文件中取出前 n 帧并将它们放入另一个文件中。但结果也无法播放。
如何只对音频的块进行编码,哪个库适合这个,块的最小大小是多少?
我检查了 lame 的源代码,文件 lame_main.c
帮助我找到了解决方案。此文件实现了 lame 命令行实用程序,它还可以对多个 wav 文件进行编码,因此它们可以无间隙地附加到单个 mp3 文件。
我的错误是每次调用 encode
函数时都初始化 lame,因此,为每个新段初始化 lame。这会导致输出 mp3 出现短暂中断。相反,初始化 lame 一次并将其重新用于后续调用已经解决了这个问题。此外,我在 encode
的开头调用 lame_init_bitstream
并适当地使用 lame_set_nocap_currentindex
和 lame_set_nogap_total
。现在,输出片段可以无缝组合了。