c++ - C/C++:流式传输 MP3
问题描述
在 C++ 程序中,我得到了多块 PCM 数据,我目前正在使用libmp3lame
这些数据将这些数据编码为 MP3 文件。PCM 块是一个接一个地产生的。但是,我不想等到 PCM 数据流完成,而是想尽早将数据编码成多个 MP3 块,以便客户端可以播放或附加这些片段。
据我了解,MP3 文件由帧组成,文件可以沿帧拆分并单独发布。此外,没有预先需要的长度信息,因此该格式适合流式传输。但是,当我使用libmp3lame
从部分数据生成 MP3 文件时,合并后的产品无法被音频播放器解释。我停用了位储存器,因此,我希望帧是独立的。
根据这篇文章,我编写了一个 Python 脚本,用于从 MP3 文件中提取和列出帧。我libmp3lame
通过首先收集整个 PCM 数据然后应用libmp3lame
. 然后,我从这个文件中取出前 n 帧并将它们放入另一个文件中。但结果也将无法播放。
怎么可能只编码音频的块,哪个库适合这个,块的最小大小是多少?
解决方案
我检查了lame的源代码,该文件lame_main.c
帮助我找到了解决方案。该文件实现了 lame 命令行实用程序,它还可以对多个 wav 文件进行编码,因此可以将它们附加到单个 mp3 文件中而没有间隙。
我的错误是每次调用encode
函数时都初始化 lame,因此,为每个新段初始化 lame。这会导致输出 mp3 的短暂中断。相反,初始化 lame 一次并将其重新用于后续调用已经解决了问题。此外,我lame_init_bitstream
在开始时调用并适当地encode
使用。现在,可以无缝组合输出片段。lame_set_nocap_currentindex
lame_set_nogap_total
推荐阅读
- python - 用上面的数据填充数据 NaN
- java - 添加到 Java 列表时无法在空对象上调用方法 add()
- elasticsearch - 如何在 kibana 发现选项卡中为字段显示更多唯一值
- c# - 使用带有自定义 HttpClientHandler 和硬件令牌的 HttpClient 连接到 API 的问题
- c# - ASP.net Core - Linq - foreach 内的动态查询
- javascript - 最佳实践:对象与开关
- python - Pandas:使用现有 Excel 文件中的每个 for 循环迭代创建新的数据框和 excel 表(自动)
- linux - 以下 sed 命令有什么作用: sed -i "s/,$//'
- python - 为训练和测试数据集绘制每个时期的损失和准确性
- powerbi - Power BI - 您已超过嵌入令牌的数量