【问题标题】:Decoding only some PCM bytes at a time from an mp3 file一次仅从 mp3 文件中解码一些 PCM 字节
【发布时间】:2018-04-05 06:19:57
【问题描述】:

如何从 mp3 文件中解码大约 1000 字节的 PCM 音频,而不解码整个内容?

我需要将 4 到 6 个音轨混合到一个,以便它们在 Android 应用中的 AudioTrack 上同时播放。

如果我可以获得 PCM 样本流,就可以做到这一点,然后将解码后的音轨加在一起(并可能调整剪辑和音量),然后将它们写入 AudioTrack 缓冲区。

那部分很简单。

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

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

感谢任何帮助。

【问题讨论】:

    标签: android audio mp3 inputstream decoder


    【解决方案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,所以你不需要做任何其他事情。

    【讨论】:

    • 我忘了给这个答案点个赞。它没有回答我的问题,我也不再从事这个项目,但它值得深思。
    • 但是我确实记得在本机 Java 代码中这样做是不可能的。我需要在 C++ 中执行此操作,因为在 Java 中处理多个音频流在 Android 手机上存在很大问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多