AudioInputStreamをそのサイズについてうそをつくだけにする必要があります。これを行うには、独自の AudioInputStream クラスを作成し、サウンド API (スケルトンのみ) から取得した通常の AudioInputStream への委譲を使用します。
public class CuttingAudioInputStream extends AudioInputStream {
private AudioInputStream delegate;
public CuttingAudioInputStream(AudioInputStream delegate) {
this.delegate = delegate;
}
/**
* Lie about length of delegate
*/
public long getFrameLength() {
// simple demo, make the caller think the stream is 44100 samples long
return Math.min(delegate.getFrameLength(), 44100);
}
// Overrides for all other methods of AudioInputStream,
// left as excercise to the reader
}
必要な制限に準拠するには、他のすべてのメソッドを実装する必要があります。途中の部分を切り取ることもできますが、read() メソッドではもう少し複雑です。
ただし、ソース/宛先が非可逆形式の場合 (たとえば、MP3 をデコードして再エンコードする場合)、このアプローチはオーディオ品質を低下させる可能性があることを指摘しなければなりません。品質の低下が許容できない場合 (同じストリームを複数回処理する場合にのみ問題になるはずです)、ファイルをデコードせずに、エンコードされたデータにカット プロセスを直接適用することをお勧めします。もちろん、これはより複雑です (処理したい各フォーマットを十分に理解する必要があります)。異なるフォーマットによってカットできる場所には制限があります。