在 Java 中播放 wav 时遇到问题

问题描述 投票:0回答:1

我想玩一个

PCM_UNSIGNED 11025.0 Hz, 8 bit, mono, 1 bytes/frame

文件如此处(1)此处(2)所述。

第一种方法有效,但我不想依赖

sun.*
东西。第二个结果只播放了一些前导帧,听起来更像是点击。不可能是 IO 问题,因为我正在从 ByteArrayInputStream 播放。

为什么会这样?

java wav playback javasound
1个回答
32
投票

我不确定为什么您链接到的第二种方法会启动另一个线程;我相信音频无论如何都会在自己的线程中播放。问题是您的应用程序在剪辑播放完之前就结束了吗?

import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.LineEvent.Type;

private static void playClip(File clipFile) throws IOException, 
  UnsupportedAudioFileException, LineUnavailableException, InterruptedException {
  class AudioListener implements LineListener {
    private boolean done = false;
    @Override public synchronized void update(LineEvent event) {
      Type eventType = event.getType();
      if (eventType == Type.STOP || eventType == Type.CLOSE) {
        done = true;
        notifyAll();
      }
    }
    public synchronized void waitUntilDone() throws InterruptedException {
      while (!done) { wait(); }
    }
  }
  AudioListener listener = new AudioListener();
  AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(clipFile);
  try {
    Clip clip = AudioSystem.getClip();
    clip.addLineListener(listener);
    clip.open(audioInputStream);
    try {
      clip.start();
      listener.waitUntilDone();
    } finally {
      clip.close();
    }
  } finally {
    audioInputStream.close();
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.