【发布时间】:2021-05-18 22:26:23
【问题描述】:
我正在尝试弄清楚如何使用 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); -
是的,做到了!继续并将其发布为答案,我会接受它:-)