根据Javadocs的说法,当我使用javax.sound.sampledTargetDataLine
的以下方法时:
public void open(AudioFormat format,int bufferSize)
其中说:
使用不符合此要求的请求缓冲区大小调用此方法可能会导致IllegalArgumentException。
所以当我实现以下Java代码时:
AudioFormat format = getAudioFormat();
DataLine.Info info = new DataLine.Info(TargetDataLine.class,format);
// open the TargetDataLine for capture.
try {
TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format, line.getBufferSize()+3000);
}
catch (LineUnavailableException ex)
{
ex.printStackTrace();
}
但是当我运行上面的代码时,它不会抛出任何异常。现在根据文件:
public int getBufferSize()
获得适合数据行内部缓冲区的最大数据字节数。对于源数据行,这是可以写入数据的缓冲区的大小。对于目标数据行,它是可以从中读取数据的缓冲区的大小。请注意,使用的单位是字节,但始终对应于音频数据的整数样本帧。
其中表示将返回最大尺寸,而我已添加3000
line.open(format, line.getBufferSize()+3000);
如上所示,为什么不抛出任何异常?
答案 0 :(得分:2)
您从open
的JavaDoc中遗漏了一些重要的描述。更完整的是,它说:
void open(AudioFormat format,
int bufferSize)
throws LineUnavailableException
打开具有指定格式和请求的缓冲区大小的行, 导致该线路获得任何所需的系统资源并成为 操作。缓冲区大小以字节为单位指定,但必须表示 整数个样本帧。用a调用此方法 可能会导致请求的缓冲区大小不符合此要求 在IllegalArgumentException中。打开的实际缓冲区大小 line可能与请求的缓冲区大小不同。实际设定的值 可以通过随后调用DataLine.getBufferSize()
来查询
因此,您指定的缓冲区大小可能不是内部缓冲区的大小,甚至可能超过它。
但是,它必须“表示整数个样本帧”,否则它将抛出IllegalArgumentException
。如果您请求内存比内部分配的内存,那么您将收到LineUnavailableException
。这并不意味着请求比当前内部缓冲区更大的大小将导致LineUnavailableException
。
至少那是我对文档的阅读。