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);
我正在尝试弄清楚如何使用 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);