繁体   English   中英

整理音频(mp3或wav文件)

[英]Trimming audio (mp3 or wav file)

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

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

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

你只需要做出的AudioInputStream 谎言关于它的大小。 为此,您可以创建自己的AudioInputStream类,并使用委派给从声音API获得的普通AudioInputStream(仅骨架):

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进行解码和重新编码),则此方法可能会降低音频质量。 如果质量损失是不可接受的(仅当您多次处理相同的流时才有意义),最好不要解码文件,而是将剪切过程直接应用于编码数据。 当然,这更加复杂(您需要对要处理的每种格式有充分的了解),并且在不同的格式下可以进行剪切的位置受到限制。

您的教程适用于Java 1.5! 有更多最新版本。

在您引用的页面上,“读取声音文件”标题下有一些示例代码。 注意带有注释的区域:

  // Here, do something useful with the audio data that's 
  // now in the audioBytes array...

这是在while循环中读取audioInputStream的地方。 如果在帧通过该区域时对其进行跟踪,则可以计算经过的时间。 可以将加载的数据保存到字节数组。 也许所需帧中的数据可以是读取audioInputStream并实现TargetDataLine的类的输出。 如果我没记错的话,可以使TargetDataLine与AudioSystem.write(...

我不知道直接编辑压缩数据甚至是wav。 WAV格式不统一,没有统一的标头。 这就是为什么我要让Java读取流,并在以这种方式公开数据时使用数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM