首页 > 解决方案 > 如何反转音频文件?

问题描述

我想知道如何获取音频文件,而不是向前播放,我想向后播放。

这是我到目前为止所拥有的

    public void addSong(String song) throws IOException, UnsupportedAudioFileException, LineUnavailableException {

    AudioInputStream audioStream = AudioSystem.getAudioInputStream(new File(song + ".wav"));

    System.out.println(AudioSystem.getAudioInputStream(new File(song + ".wav")));

    AudioFormat format = audioStream.getFormat();
    DataLine.Info info = new DataLine.Info(Clip.class, format);
    Clip clip = (Clip) AudioSystem.getLine(info);

    songs.add(song);
    songsMedia.add(audioStream);
    clips.add(clip);
    //display.makeButton(song);
}
public void playSong(String song) throws LineUnavailableException, IOException, UnsupportedAudioFileException {
    if(songs.contains(song)){
        int nFrames = songsMedia.get(0).getFormat().getFrameSize();

        stopSong=true;
        index = songs.indexOf(song);


        clips.get(index).open(songsMedia.get(index));
        clips.get(index).start();
        playingSongs.add(clips.get(index));



    }else if(song == "Pause/Play"){
        System.out.print("");
    }
    else{
        System.out.println(song);
        System.out.println("Cannot Find Song");
    }
}

如何从音频流中获取所有样本以便重新排列它们?

标签: javaaudio

解决方案


不幸的是,ClipAPI 没有公开Clip. 但是你可以通过使用播放来获得你想要的SourceDataLine,并添加一些步骤。

首先,使用AudioInputStream.

各个字节需要根据音频格式中指定的帧大小以小块进行处理,并以相反的“帧”顺序排序。例如,如果音频格式每帧需要四个字节(如立体声,16 位编码),那么反转将以四个字节的块发生。

例如,一个 4 帧长的音频文件,由字节 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 以相反的帧顺序组成变为 12,13,14,15,8,9,10,11,4,5,6,7,0,1,2,3。

字节数据可以通过SourceDataLine. 我认为您应该能够找到SourceDataLine播放的代码示例。您必须做出的关键更改是从倒序数组中获取数据以进行回放,而不是AudioInputStream像通常那样从数组中获取数据。

github 库AudioCue是围绕制作一种超级剪辑的想法而构建的,其中可以访问各个 PCM 数据帧。您可以检查第359 行的loadURL方法,作为通过 将数据加载到数组中的示例AudioInputStream。该示例将数据转换为 PCM 浮点数,而不是将其保留为字节。因此,您必须进行一些更改/简化。存储为浮点数可以更轻松地执行混合和“变速”播放等操作,如果您决定还想加速或减速、前进或后退,这可能会很有用。


推荐阅读