我可能很笨,但我似乎找不到解决我的问题的方法
(NOTE:我发现很多人报告了这个问题,似乎它是由于较新的 Java(可能是 1.5?)而发生的。也许不再支持 SAMPLE_RATE?我无法找到任何解决方案).
我正在尝试调整 SAMPLE_RATE 以加快/减慢歌曲速度。我可以毫无问题地成功播放 .wav 文件,因此我研究了用于调节音量的 FloatControl:
public void adjustVolume(String audioType, float gain) {
FloatControl gainControl = null;
gainControl = (FloatControl) clipSFX.getControl(FloatControl.Type.MASTER_GAIN);
if(gain > MAX_VOLUME)
gain = MAX_VOLUME;
if(gain < MIN_VOLUME)
gain = MIN_VOLUME;
//set volume
gainControl.setValue(gain);
}
但是,当尝试将此原则转化为 SAMPLE_RATE 时,我在这个阶段很早就收到了错误:
public void adjustVolume(String audioType, float gain) {
FloatControl gainControl = null;
gainControl = (FloatControl) clipSFX.getControl(FloatControl.Type.SAMPLE_RATE);
//ERROR: Exception in thread "Thread-3" java.lang.IllegalArgumentException: Unsupported control type: Sample Rate
//I haven't gotten this far yet since the above breaks, but in theory will then set value?
gainControl.setValue(gain);
}
我在网上找到的所有内容似乎都与从麦克风或某些外部线路获取输入有关,并且似乎没有转化为使用音频文件,所以我不确定我错过了什么。任何帮助,将不胜感激!谢谢!
这里我们有一个改变速度的方法——通过加倍采样率。基本上步骤如下:
- 打开文件的音频流
- 获取格式
- 创建更改采样率的新格式
- 打开具有该格式的数据行
- 从文件/音频流中读取并在线播放
这里的概念是SourceDataLine、AudioFormat 和AudioInputStream。如果您查看 javax.sound 教程,您会找到它们,甚至是类的页面。您现在可以创建自己的方法(例如 adjustment(factor)),该方法仅获取新格式,而其他所有内容保持不变。
public void play() {
try {
File fileIn = new File(" ....);
AudioInputStream audioInputStream=AudioSystem.getAudioInputStream(fileIn);
AudioFormat formatIn=audioInputStream.getFormat();
AudioFormat format=new AudioFormat(formatIn.getSampleRate()*2, formatIn.getSampleSizeInBits(), formatIn.getChannels(), true, formatIn.isBigEndian());
System.out.println(formatIn.toString());
System.out.println(format.toString());
byte[] data=new byte[1024];
DataLine.Info dinfo=new DataLine.Info(SourceDataLine.class, format);
SourceDataLine line=(SourceDataLine)AudioSystem.getLine(dinfo);
if(line!=null) {
line.open(format);
line.start();
while(true) {
int k=audioInputStream.read(data, 0, data.length);
if(k<0) break;
line.write(data, 0, k);
}
line.stop();
line.close();
}
}
catch(Exception ex) { ex.printStackTrace(); }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)