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 bit, mono, 1 bytes/frame, Audio Sample Rate 8Khz.

誰でも問題を解決するのを手伝ってもらえますか?

4

3 に答える 3

1

「outputStream.flush();」の後、しばらく寝てはどうでしょうか。
Thread.sleep(50) かもしれません

于 2013-11-14T07:04:15.983 に答える
1

あなたの問題は、受信側と再生側にあると思います。オーディオ データと一致するようにオーディオ サンプル レートを設定します。また、シリアルポートのフロー制御が有効になっていることを確認してください (または、正しい再生速度が得られてもオーディオの一部が失われている場合は調べてください)。ファイルのサンプル レートがわかっているので、受信側が同じサンプル レート (およびその他のパラメーター) を持つように設定します。

受信側が届かないか変更できない場合は、送信側でサンプルレートを変更して、受信側が期待するものと一致させる必要があります。最も簡単なのは、オーディオ エディタ (コマンド ライン ツールであるSoXなど) を使用してオーディオ ファイルを変更することです。適切なオーディオ形式で良好な再生ができることを確認するためだけに、まずこれを試してください。

より柔軟な方法は、プログラムで実行することです。これにより、任意のオーディオ ファイルをフィードして、正しいサンプル レートに変換し、正しく再生できます。しかしもちろん、これはより複雑でもあります。Elliott Frisch による他の回答で推奨されているようなライブラリを探します。

于 2013-11-18T06:26:32.383 に答える
1

私は以下をチェックします - 特に#3。

  1. 同期
  2. オーディオ形式
  3. JSSRC リサンプリング ライブラリ
于 2013-11-14T00:25:23.423 に答える