4

我正在尝试使用 java 声音库和下面的代码在我的树莓派上使用 javafx 播放 wav 文件,我收到如下错误

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian not supported.

谷歌搜索后,我发现

树莓派声卡驱动程序不支持大端音频格式,我需要更改 getAudioFormat() 函数以请求小端格式:

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 ); 
4

1 回答 1

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); 
于 2013-09-13T11:51:04.257 回答