我想通过GSM调制解调器播放WAV文件。这是我的示例代码
private final int BUFFER_SIZE = 8;
private File soundFile;
private AudioInputStream audioStream;
private AudioFormat audioFormat;
public void playSound(String filename) throws IOException{
String strFilename = filename;
try {
soundFile = new File(strFilename);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
try {
audioStream = AudioSystem.getAudioInputStream(soundFile);
} catch (Exception e){
e.printStackTrace();
System.exit(1);
}
audioFormat = audioStream.getFormat();
DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
int nBytesRead = 0;
byte[] abData = new byte[BUFFER_SIZE];
while (nBytesRead != -1) {
try {
nBytesRead = audioStream.read(abData);
} catch (IOException e) {
e.printStackTrace();
}
if (nBytesRead >= 0) {
outputStream.write(abData, 0, nBytesRead);
outputStream.flush();
}
}
}
但问题是通过串口发送的WAV文件播放速度非常快。我不知道是什么问题。这是我的WAV文件描述:
ULAW 8000.0 Hz, 8 bit, mono, 1 bytes/frame, Audio Sample Rate 8Khz
。
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
我会检查以下内容 - 特别是#3。
答案 1 :(得分:1)
在“outputStream.flush();”之后休息片刻怎么样? 可能是Thread.sleep(50)
答案 2 :(得分:1)
我认为您的问题出在接收端并正在播放。设置音频采样率以匹配您的音频数据。还要确保启用串行端口流控制(或者如果获得正确的播放速度,则查看它,但部分音频丢失)。您知道文件的采样率,因此将接收端设置为具有相同的采样率(和其他参数)。
如果接收端无法接收或无法更改,则需要更改发送端的采样率以匹配接收方的预期。最简单的方法是使用一些音频编辑器(例如SoX,这是命令行工具)来更改音频文件。您应该首先尝试这一点,只是为了检查您是否可以使用正确的音频格式进行良好的播放。
更灵活的方法是在您的程序中执行此操作,因此您可以将其提供给任何音频文件,然后将其转换为正确的采样率并正确播放。但这当然也更复杂。寻找一个图书馆,例如Elliott Frisch在其他答案中推荐的the one。