java - 修剪音频(mp3 或 wav 文件)

标签 java javasound

我有一个关于音频文件修改的简单问题。我可以通过输入流访问样本(解码等),但我无法找到一种方法来操作该输入流中的样本(可能是多个样本的情况)。
我想要实现的是获取一个文件 Ex A.mp3,从中删除几秒钟,最后将其存储到一个新文件中。

通过查看JavaSoundApi examples ,我发现可以通过以下方式创建文件:

    File fileOut = new File(someNewPathName);
    AudioFileFormat.Type fileType = fileFormat.getType();
    if (AudioSystem.isFileTypeSupported(fileType,audioInputStream)) {
        AudioSystem.write(audioInputStream, fileType, fileOut);
    }

最佳答案

您只需让 AudioInputStream谎言其大小即可。为此,您可以创建自己的 AudioInputStream 类,并使用对从声音 API 获取的普通 AudioInputStream 的委托(delegate)(仅骨架):

public class CuttingAudioInputStream extends AudioInputStream {

    private AudioInputStream delegate;

    public CuttingAudioInputStream(AudioInputStream delegate) {
        this.delegate = delegate;
    }

    /**
     * Lie about length of delegate
     */
    public long getFrameLength() {
        // simple demo, make the caller think the stream is 44100 samples long
        return Math.min(delegate.getFrameLength(), 44100); 
    }

    // Overrides for all other methods of AudioInputStream, 
    // left as excercise to the reader
}

您只需实现所有其他方法即可遵守您想要的限制。你也可以剪掉中间的部分,只是 read() 方法稍微复杂一点。

但是,我觉得有必要指出,如果源/目标是有损格式(例如 MP3 被解码并重新编码),则这种方法可能会降低音频质量。如果质量损失 Not Acceptable (仅当您多次处理同一流时才重要),您最好不解码文件,而是将剪切过程直接应用于编码数据。当然,这比较复杂(您需要对要处理的每种格式有很好的了解),并且不同格式对您可以剪切的位置有限制。

关于java - 修剪音频(mp3 或 wav 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11775232/

相关文章:

java - 使用Java连接mysql数据库失败

java - 这段 Java 代码什么时候会发生垃圾回收?

java - GWT 上的 JsonP 响应代码

java - 使用 Java Sound API 播放 MP3

Java:如何获取音频输入的当前频率?

java - Java Sound API 在您的计算机上找到哪些输出和录音端口?

java - 如何使用 Selenium Webdriver Java 查找表行号

java - 在流程中实现故障安全行为

Java声音API : Recording and monitoring same input source

java - 处理 3 中的音频输入流