【问题标题】:Java audio... getting from byte[] of raw waveform to playable ClipJava音频...从原始波形的字节[]到可播放剪辑
【发布时间】: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);
  • 是的,做到了!继续并将其发布为答案,我会接受它:-)

标签: java audio


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多