У меня есть стерео AudioInputStream
, и я хочу разделить его на два моно AudioInputStream
s, один для левого и один для правого канала стереопотока. Как мне это сделать?
Примечание: Я уже проверил ответы на следующий вопрос, но у меня ничего не получилось (поэтому я и спрашиваю снова).
Как разбить WAV-файл на каналы в java?
Вот то, что я пытаюсь заставить работать (в основном по ссылке выше). В следующем коде пока l oop работает бесконечно. readsize
всегда равно 4 (или каков sampleInBytes * 2
), оно никогда не становится -1 (что означает, что это конец потока), поэтому оно никогда не прерывается.
AudioInputStream originalAudioInputStream = null;
try {
originalAudioInputStream = AudioSystem.getAudioInputStream(audiofile);
} catch (UnsupportedAudioFileException e) {
//file not supported
} catch (IOException e) {
//error
}
//read file and convert it to PCM SIGNED big endian
AudioFormat destaf = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
originalAudioInputStream.getFormat().getSampleRate(),
originalAudioInputStream.getFormat().getSampleSizeInBits(),
originalAudioInputStream.getFormat().getChannels(),
originalAudioInputStream.getFormat().getSampleSizeInBits() / 8 * originalAudioInputStream.getFormat().getChannels(),
originalAudioInputStream.getFormat().getSampleRate(), true);
AudioInputStream signedBigEndianInputStream = AudioSystem.getAudioInputStream(destaf, originalAudioInputStream);
//split stereo AudioInputStream
ByteArrayOutputStream leftbaos = new ByteArrayOutputStream();
ByteArrayOutputStream rightbaos = new ByteArrayOutputStream();
byte[] bytes = new byte[(signedBigEndianInputStream.getFormat().getSampleSizeInBits()/8)*2];
while (true) {
int readsize = 0;
try {
readsize = signedBigEndianInputStream.read(bytes);
} catch (IOException e) {
e.printStackTrace();
}
if(readsize==-1){
break;
}
rightbaos.write(bytes,0,bytes.length/2);
leftbaos.write(bytes,bytes.length/2,bytes.length/2);
}
byte[] leftData = leftbaos.toByteArray();
byte[] rightData = rightbaos.toByteArray();
AudioFormat outFormat = new AudioFormat(signedBigEndianInputStream.getFormat().getEncoding(),signedBigEndianInputStream.getFormat().getSampleRate(),signedBigEndianInputStream.getFormat().getSampleSizeInBits(),1,signedBigEndianInputStream.getFormat().getFrameSize()/2, signedBigEndianInputStream.getFormat().getFrameRate(),signedBigEndianInputStream.getFormat().isBigEndian());
ByteArrayInputStream leftbais = new ByteArrayInputStream(leftData);
AudioInputStream leftoutputAIS = new AudioInputStream(leftbais, outFormat, leftData.length / outFormat.getFrameSize());
ByteArrayInputStream rightbais = new ByteArrayInputStream(rightData);
AudioInputStream rightoutputAIS = new AudioInputStream(rightbais, outFormat, rightData.length / outFormat.getFrameSize());
//close inputstreams
try {
rightoutputAIS.close();
leftoutputAIS.close();
rightbais.close();
leftbais.close();
rightbaos.close();
leftbaos.close();
signedBigEndianInputStream.close();
originalAudioInputStream.close();
} catch (IOException e) {
//error
}
Спасибо!