我正在学习如何在Java中播放声音,但要具有高级控件。
我发现了一个问题: javax.sound.sampled.AudioInputStream 不支持Mp3文件,并且我已经耗尽了寻找如何控制平移的想法。 / p>
我设法使用 javazoom.jl.player.advanced.AdvancedPlayer 播放了Mp3文件,但是它没有平移控件,或者我还没有建立它。
我的实际代码将打开一个文件,如果格式与 AudioInputStream 兼容,则它将仅播放正确的频道。如果格式不正确,则使用 AdvancedPlayer 播放。
您知道一种对mp3文件进行平移控制的方法吗?
我的代码在这里:
private void btnShowValueActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String strStart,strEnd, strNumbers;
int intStart,intEnd, intNumber;
strStart = this.txtEnterStart.getText();
strEnd = this.txtEnterEnd.getText();
intStart = Integer.parseInt(strStart);
intEnd = Integer.parseInt(strEnd);
for(int x = intStart; intEnd >= x; x++){
strNumbers = Integer.toString(x);
this.lblOutput.setText(strNumbers += x);
}
}
答案 0 :(得分:1)
平移和音量控制取决于系统,即使安装到位,有时也会有些不稳定。例如,如果您一次更改音量或平移设置太多,则不连续会引起咔嗒声。
一种解决方案是逐帧进入并自行进行更改。例如,请参阅教程Processing Audio with Controls末尾的“直接操作音频数据”。
有关示例,请查看关于下一个教程的代码:Using Files and Format Converters。在标题“读取声音文件”下查找,并在代码“ \这里,做一些有用的事情……”中查找注释
我邀请您也看看我编写并提供的代码,该类称为AudioCue,具有实时平移以及实时音量和音高播放控件。我添加了平滑功能(用于平移更改的1024个步骤),以帮助减少不连续的可能性。
由您决定要提取mp3文件并将其解码为音频数据数组。我认为github上提供的javazoom库应该为您提供足够的代码访问权限,以弄清楚如何执行此操作(我在进行ogg / vorbis解码时就这样做了)。一旦有了音频数据的浮点数组(立体声,带符号的浮点范围从-1到1),就可以将其直接加载到AudioCue。
答案 1 :(得分:0)
首先,感谢 Andrew Thompson和Phil Freihofner ,我很高兴成为这个社区的一员并得到信任的人。你真的感到很开心:)
我在这里留下了完全符合我想要的代码。
正如JavaZoom MP3 SPI文档所述:确保CLASSPATH中提供JLayer,Tritonus和MP3SPI库。
import javax.sound.sampled.*;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException,
UnsupportedAudioFileException, LineUnavailableException {
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(null);
String path = chooser.getSelectedFile().getAbsolutePath();
System.err.println(path);
File file = new File(path);
AudioInputStream baseStream = AudioSystem.getAudioInputStream(file);
AudioFormat baseFormat = baseStream.getFormat();
System.err.println(baseFormat.toString());
AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16, baseFormat.getChannels(), baseFormat.getChannels() * 2,
baseFormat.getSampleRate(), true);
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
AudioInputStream stream = AudioSystem.getAudioInputStream(format, baseStream);
SourceDataLine audioLine = (SourceDataLine) AudioSystem.getLine(info);
audioLine.open(format);
audioLine.start();
FloatControl pan = (FloatControl) audioLine.getControl(FloatControl.Type.PAN);
pan.setValue(1);
int BUFFER_SIZE = 4096;
byte[] buffer = new byte[BUFFER_SIZE];
int read = -1;
while((read = stream.read(buffer)) != -1){
audioLine.write(buffer, 0, read);
}
audioLine.drain();
audioLine.close();
}
}