0

根据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); 

如上所示,为什么它不抛出任何异常?

4

1 回答 1

2

您从 JavaDoc 中遗漏了open. 更完整地说,它说:

void open(AudioFormat format,
          int bufferSize)
          throws LineUnavailableException

打开具有指定格式和请求的缓冲区大小的行,使该行获取任何所需的系统资源并开始运行。缓冲区大小以字节为单位指定,但必须表示整数个样本帧。使用不满足此要求的请求缓冲区大小调用此方法可能会导致 IllegalArgumentException。打开行的实际缓冲区大小可能与请求的缓冲区大小不同。实际设置的值可以通过后续调用DataLine.getBufferSize()来查询

因此,您指定的缓冲区大小可能不是内部缓冲区的大小,甚至可能超过它。

但是,它必须“代表整数个样本帧”,否则会抛出IllegalArgumentException. 如果您请求的内存超出内部分配的范围,那么您将收到LineUnavailableException。这并不意味着请求比当前内部缓冲区更大的大小将导致LineUnavailableException.

至少这是我对文档的阅读。

于 2012-05-25T13:47:58.763 回答