如何从mp3文件中解码大约1000字节PCM音频的内容,而不解码整个内容?
我需要将4到6个音轨混合在一起,从而使它们在Android应用程序的AudioTrack中同时播放。
如果我可以获取PCM样本流,然后将解码的音轨加在一起(并可能调整剪切和音量),然后将它们写入AudioTrack缓冲区,则可以完成此操作。
这部分很简单。
但是,如何将单个mp3文件解码为可以从其获取字节数组的输入流?我找到了一个名为JLayer的东西,但我对如何做到这一点还不太清楚。
我宁愿避免在C++中这样做(我有点生疏,我的团队不喜欢它),但是如果需要的话,我可以这样做。尽管我需要一个简短的示例,说明如何通过mpg123或其他此类库从文件中获得240个解码字节。
任何帮助表示赞赏。
最佳答案
您可以做的最小的是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,因此您无需执行其他任何操作。
关于android - 一次仅从mp3文件中解码一些PCM字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46910743/