我正在尝试使用java声音库和下面的代码在我的raspbery pi上播放wav文件usinf javafx,我收到如下错误
javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian not supported.
在谷歌周围后我发现了
raspberry pi声卡驱动程序不支持 big-endian音频格式,我需要更改getAudioFormat()函数以请求little-endian格式:boolean bigEndian = false;
好到目前为止我认为我需要以下
private AudioFormat getAudioFormat() {
float sampleRate = 8000.0F;
int sampleInbits = 16;
int channels = 1;
boolean signed = true;
boolean bigEndian = false;
return new AudioFormat(sampleRate, sampleInbits, channels, signed, bigEndian);
}
但我从哪里拨打以下代码中的getAudioFormat()
。
URL url = this.getClass().getClassLoader().getResource("Audio/athan1.wav");
Clip clip = AudioSystem.getClip();
AudioInputStream ais = AudioSystem.getAudioInputStream( url );
答案 0 :(得分:3)
查看AudioSystem
(API)中的方法签名。有一种方法getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream)
。
通过调用被覆盖的AudioFormat
(或参见下文)获得getAudioFormat()
后,您应该能够(引用API):
通过转换获得指定格式的音频输入流 提供的音频输入流。
替代覆盖getAudioFormat()
(因为如果你想在将来播放其他文件类型会发生什么?),请查看问题Conflicting Jar Methods中的第一个代码段,它似乎正是在做什么你想要的,而不必重写方法,也是用上述方法转换音频流的一个例子。
试试这个。
URL url = this.getClass().getClassLoader().getResource("Audio/athan1.wav");
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
AudioFormat littleEndianFormat = getAudioFormat();
AudioInputStream converted = AudioSystem.getAudioInputStream(littleEndianFormat, ais);