Java 音频...从原始波形的字节 [] 获取可播放剪辑

Java audio... getting from byte[] of raw waveform to playable Clip

我正在尝试弄清楚如何使用 Java 播放原始 8 位(有符号)波形,并且苦苦挣扎,因为我发现的每个 API 示例似乎都假定媒体播放来自一份文件。到目前为止,这是我所拥有的(为清楚起见而缩短):

// Assume waveform array has 480 bytes, and consists of 24 periods of a 1000hz sine wave.
byte[] waveform = WaveformGenerator.generateWaveform();

Clip clip = AudioSystem.getClip();
ByteArrayInputStream fakeInputStream= new ByteArrayInputStream(waveform);
AudioInputStream inputStream = AudioSystem.getAudioInputStream(fakeInputStream);
clip.open(inputStream);
clip.start();

运行时,AudioSystem.getAudioInputStream(fakeInputStream) 抛出 javax.sound.sampled.UnsupportedAudioFileException: Stream of unsupported format 在它甚至 使 到 clip.open(inputStream);

之前

好的,很公平...我想我需要告诉它这是一个单声道 8 位 PCM 波形。所以,我创建了一个 AudioFormat 让它知道它是 48khz 8 位 PCM...

AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 48000, 8, 1, 1, 48000, false);

... 然后意识到(为时已晚)允许您指定格式的 AudioSystem.getAudioInputStream() 变体要求您 已经 一个 AudioInputStream。据我所知,getAudioInputStream 没有允许您同时指定其类型 内容的变体。

显然,我走错了路。那么...什么从包含原始 8 位带符号 PCM 波形的字节数组到可以播放 () 的音频对象的正确方法?

像这样直接调用构造函数:

AudioInputStream inputStream = new AudioInputStream(fakeInputStream, audioFormat, waveform.length);