从mp3文件一次只解码一些PCM字节

时间:2017-10-24 12:34:14

标签: android audio mp3 inputstream decoder

如何解码来自mp3文件的1000字节PCM音频的内容,而不解码整个内容?

我需要将四到六首曲目混合在一起,以便在Android应用中的AudioTrack上同时播放。

如果我可以获得PCM样本流,并且如此简单地将解码后的轨道添加到一起(并且可能调整剪辑和音量),然后将它们写入AudioTrack缓冲区,就可以完成此操作。

那部分很简单。

但是如何解码单个mp3文件,输入流我可以从中获取字节数组?我发现了一些名为JLayer的东西,但我不清楚如何做到这一点。

我宁愿避免在C ++中这样做(我有点生疏,我的团队也不喜欢它),不过如果需要的话我可以做到。虽然我需要一个简短的例子,说明如何通过mpg123或其他类似的库从文件中说出240个解码的字节。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

你可以做的最小的是576个样本,这是最小的MP3帧大小。但是,大多数MP3流使用比特储存器意味着您可能必须解码要解码的帧周围的帧。

进一步复杂化,裸MP3流没有任何内部时间戳,因此如果要在文件中间准确删除,则必须在此之前进行解码。 (MP3帧头不包含字节长度,因此您不能准确地略过帧头。)可以尝试根据字节长度插入文件的中间位置,但是这样即使对于CBR,也不是一种准确的搜索方式,可以在几秒钟内关闭。对于VBR来说,它到处都是。

听起来你需要做的就是拥有一个流解码器,以便在播放过程中进行解码。我不是Android开发人员,但似乎你可以在流媒体模式下使用框架中的AudioTrack。 https://developer.android.com/reference/android/media/AudioTrack.html然后MediaCodec实际进行解码。 https://developer.android.com/reference/android/media/MediaCodec.html Android设备支持MP3,因此您无需执行任何其他操作。