是否有 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,这就是我想在技术上实现它的方式
- 音频由帧组成。每个帧代表一个时隙。使用
AudioInputStream read()
方法将音频文件转换为原始音频数据 (byte[]
)
- 找到代表开始时隙的帧(使用
audioInputStream.getFrameLength()
和audioInputStream.getFrameRate()
APIs)
- 找到表示结束时隙的帧(使用
audioInputStream.getFrameLength()
和audioInputStream.getFrameRate()
APIs)
- 删除数组中开始和结束时隙之间的帧
- 将字节数组转换为
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 为您工作,我不会感到惊讶。
我正在以编程方式处理 .mp3 音频文件的 removing/redacting 部分。一个示例场景是在 3 分钟 (0:00 - 3:00) 音频文件中静音/删除 1:00 - 2:00 中的音频。我们有任何可用于此场景的库吗?
我知道如何使用 Javax Sound API(包:javax.sound
)为 .wav 音频文件实现这一点,但看起来 API 不支持 . mp3 文件
如果我要使用 .wav,这就是我想在技术上实现它的方式
- 音频由帧组成。每个帧代表一个时隙。使用
AudioInputStream read()
方法将音频文件转换为原始音频数据 (byte[]
) - 找到代表开始时隙的帧(使用
audioInputStream.getFrameLength()
和audioInputStream.getFrameRate()
APIs) - 找到表示结束时隙的帧(使用
audioInputStream.getFrameLength()
和audioInputStream.getFrameRate()
APIs) - 删除数组中开始和结束时隙之间的帧
- 将字节数组转换为
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 为您工作,我不会感到惊讶。