在GSM调制解调器上播放WAV文件

6

我想要通过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位,单声道,1字节/帧,音频采样率8Khz。有人可以帮助我解决这个问题吗?

你在哪里创建输出流?它可能有错误的采样率。 - Radiodef
3个回答

1
我认为您的问题在于接收端和播放方面。将音频采样率设置为与音频数据相匹配。同时确保启用串口流控制(如果播放速度正确,但部分音频丢失,则需查看此项)。您知道文件的采样率,因此请将接收端设置为具有相同的采样率(和其他参数)。
如果接收端无法更改或无法到达,则需要更改传输端的采样率以匹配接收器所期望的采样率。最简单的方法是使用一些音频编辑器(例如SoX,这是一个命令行工具)来更改音频文件。您应该首先尝试此方法,以检查是否可以使用正确的音频格式获得良好的播放效果。
更灵活的方法是在程序中进行转换,这样您就可以提供任何音频文件,并将其转换为正确的采样率并正确播放。但这当然也更加复杂。寻找一个库,例如Elliott Frisch在另一个答案中推荐的the one

"...你需要改变传输端的采样率以匹配接收器的期望" - 我认为你应该将调制解调器设置为语音模式,然后将文件播放到调制解调器中。在调制解调器中的播放必须与发送调制解调器的设置相匹配。我不认为被叫方的设备会有任何影响。 - jww

1

1

在 "outputStream.flush();" 后面睡一会儿怎么样?
可以使用 Thread.sleep(50)


有没有关于睡眠时间的计算公式? - Shantanu Banerjee
这绝对不是正确的做法。即使你能在发送端以这种方式获得稳定的采样率(除非你有实时操作系统...),接收端也期望特定的采样率,如果你在发送端通过限制采样率来实现,最多只能得到非常糟糕的声音质量。 - hyde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接