Java 如何反转音频文件?
我想知道怎样才能把一个音频文件拿出来,而不是向前播放,而是向后播放 这就是我目前所拥有的Java 如何反转音频文件?,java,audio,Java,Audio,我想知道怎样才能把一个音频文件拿出来,而不是向前播放,而是向后播放 这就是我目前所拥有的 public void addSong(String song) throws IOException, UnsupportedAudioFileException, LineUnavailableException { AudioInputStream audioStream = AudioSystem.getAudioInputStream(new File(song + ".wav"
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");
}
}
如何从音频流中提取所有样本,以便重新排列它们?不幸的是,
剪辑
API没有公开剪辑
保存的数据。但是,您可以使用SourceDataLine
进行播放,并添加一些步骤来获得所需的内容
首先,使用AudioInputStream
获取所有单个样本
单个字节需要根据音频格式中指定的帧大小进行小块处理,并以相反的“帧”顺序排列。例如,如果音频格式要求每帧四个字节(与立体声、16位编码一样),则反转将以四个字节的块进行
例如,由字节0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15组成的4帧长音频文件按相反的帧顺序变为12,13,14,15,8,9,10,11,4,5,6,7,0,1,2,3
字节数据可以通过SourceDataLine
播放。我认为您应该能够找到SourceDataLine
回放的代码示例。您需要做的关键更改是从逆序数组中获取播放数据,而不是像通常那样从AudioInputStream
中获取播放数据
github库AudioCue是围绕制作一种超级剪辑的想法而构建的,在这种超级剪辑中,可以访问单个PCM数据帧。您可以检查第359行的方法,作为通过AudioInputStream
将数据加载到数组中的示例。该示例将数据转换为PCM浮点值,而不是将其保留为字节。因此,您必须进行一些更改/简化。以浮点形式存储使混合和“变速”播放等操作变得更容易,如果您决定要加速或减速、前进或后退,这可能会很有用