android - 一次仅从mp3文件中解码一些PCM字节

标签 android audio mp3 inputstream decoder

如何从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/

相关文章:

java - Fragment 中的 getView() 导致抛出异常,不确定原因

android - Unresolved reference : FirebaseInstanceId

node.js - 具有增益控制的node.js中的Mp3音频

Java - 频繁播放短音频剪辑时出现延迟

actionscript-3 - 在 as3 中停止嵌入的声音

c++ - 使用 mciSendString (MCIERR_CANNOT_LOAD_DRIVER) 播放 mp3 文件

android - RecyclerView 日志语句 : W/RecyclerView: RecyclerView does not support scrolling to an absolute position. 改为使用 scrollToPosition

android - 统一3D : What is the Android Bundle Version and Version Code and how do they relate?

javascript - 哪里是存储非代码文件(例如 mp3)以便使用 codepen 进行 javascript 测试的好地方?

c++ - SDL2 和 SMPEG2 - 尝试读取 MP3 时声音缓冲区为空