我正在尝试在Ubuntu 11.10笔记本电脑上用Java编写自定义合成器。这是我的代码:
package com.sibbo.audio;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
public class Audio {
public static void main(String[] args) throws LineUnavailableException {
byte[] data = new byte[16000 * 2];
sinus(data);
AudioFormat format = new AudioFormat(16000, 8, 1, true, true);
Clip c = javax.sound.sampled.AudioSystem.getClip();
c.open(format, data, 0, data.length); // throws IllegalArgumentException
}
private static void sinus(byte[] data) {
for (int i = 0; i < data.length; i++) {
data[i] = (byte) (Math.sin(i / 200.0) * 127);
}
}
}
在标记的行处,它会抛出异常,说:“格式无效”。如何确定哪些AudioFormats合法?我已经尝试过切换signed / unsigned和little / big endian的布尔值。
答案 0 :(得分:2)
我认为错误信息是另一种方式。它没有抱怨系统不支持AudioFormat,而是无法将数据解析为这种格式。来自Javadoc:
抛出:
IllegalArgumentException - 如果缓冲区大小不表示整数个样本帧,或者格式未完全指定或无效
答案 1 :(得分:0)
一年后,我遇到了同样的问题。不过,我想出了一些东西;假设c.getInfo()返回DataLine.Info,下面给出了支持的格式:
((DataLine.Info)clip.getLineInfo()).getFormats()
出于某种原因,我只有一种支持的格式,这有点奇怪。此外,我按照代码,并使用不支持列表中的AudioFormat确实给你错误“格式无效。”