是否有 Java 库以编程方式删除 .mp3 音频文件的一部分?

Is there a Java library to programmatically remove parts of an .mp3 audio file?

我正在以编程方式处理 .mp3 音频文件的 removing/redacting 部分。一个示例场景是在 3 分钟 (0:00 - 3:00) 音频文件中静音/删除 1:00 - 2:00 中的音频。我们有任何可用于此场景的库吗?

我知道如何使用 Javax Sound API(包:javax.sound)为 .wav 音频文件实现这一点,但看起来 API 不支持 . mp3 文件

如果我要使用 .wav,这就是我想在技术上实现它的方式

  1. 音频由帧组成。每个帧代表一个时隙。使用 AudioInputStream read() 方法将音频文件转换为原始音频数据 (byte[])
  2. 找到代表开始时隙的帧(使用audioInputStream.getFrameLength()audioInputStream.getFrameRate() APIs)
  3. 找到表示结束时隙的帧(使用audioInputStream.getFrameLength()audioInputStream.getFrameRate()APIs)
  4. 删除数组中开始和结束时隙之间的帧
  5. 将字节数组转换为AudioInputStream - AudioSystem.getAudioInputStream(ByteArrayInputStream)

参考资料- AudioInputStream AudioSystem

就 .wav 文件而言,我认为您的方向是正确的。

帧到时间的转换取决于采样率。例如 44100 fps 将时间 0.5 = 帧位置 22050。原始数据每帧可能有多个字节。 16位编码当然是2个字节,立体声16位是每帧4个字节。

通常在处理字节数据之前将字节数据与带符号的 PCM 浮点数(范围从 -1 到 1)相互转换是值得的。

要处理 mp3 文件,必须先解压缩文件,进行编辑,然后重新压缩回 mp3。 mp3 coding/decoding 的库可以在以下位置的 git 集线器中找到:pdudits/soundlibs 很大程度上取决于声音文件在压缩之前的格式。

我不知道从这些工具获取 .mp3 文件的 PCM 帧的细节。我记得必须修改 JORBIS 中的代码以在将数据发送到回放输出之前拦截数据。如果您必须经历类似的事情才能让 JLayer 为您工作,我不会感到惊讶。