java - 如何反转音频文件?
问题描述
我想知道如何获取音频文件,而不是向前播放,我想向后播放。
这是我到目前为止所拥有的
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");
}
}
如何从音频流中获取所有样本以便重新排列它们?
解决方案
不幸的是,Clip
API 没有公开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 浮点数,而不是将其保留为字节。因此,您必须进行一些更改/简化。存储为浮点数可以更轻松地执行混合和“变速”播放等操作,如果您决定还想加速或减速、前进或后退,这可能会很有用。
推荐阅读
- python - 如何处理“不能在引号括起来的字符串后指定额外字符”错误?
- notepad++ - Notepad ++在每行的第n个字符中插入一个单词(向后)
- python - 如何为模板创建无限数量的标题
- python - 如何使用 django 解决 web 调用的 python 模型
- graphql - Graphql Nest 解析器分为 3 个级别
- javascript - 从 JavaScript 中的值获取对象的分配变量名称
- laravel - Laravel - 如何将渲染组件传递给变量?
- java - javax.xml.ws.soap.SOAPFaultException:访问被拒绝
- javascript - CSS光标没有改变外观
- python - 我是否正确使用了python池?