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

JavaDocforからいくつかの重要な説明を省略しましたopen。より完全に、それは言います:

void open(AudioFormat format,
          int bufferSize)
          throws LineUnavailableException

指定されたフォーマットと要求されたバッファサイズでラインを開き、ラインが必要なシステムリソースを取得して操作可能になるようにします。バッファサイズはバイト単位で指定されますが、サンプルフレームの整数を表す必要があります。この要件を満たさない要求されたバッファサイズでこのメソッドを呼び出すと、IllegalArgumentExceptionが発生する可能性があります。オープンラインの実際のバッファサイズは、要求されたバッファサイズと異なる場合があります。実際に設定された値は、後でDataLine.getBufferSize()を呼び出すことによって照会できます。

したがって、指定するバッファーサイズは、内部バッファーのサイズではなく、それを超える場合もあります。

ただし、「整数個のサンプルフレームを表す」必要があります。そうしないと、がスローされIllegalArgumentExceptionます。内部で割り当てることができるよりも多くのメモリを要求すると、を受け取りますLineUnavailableException。これは、現在の内部バッファよりも大きいサイズを要求すると結果が得られるという意味ではありませんLineUnavailableException

少なくとも、それは私のドキュメントの読み方です。

于 2012-05-25T13:47:58.763 に答える