package org.jcodec.common.tools;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.jcodec.codecs.wav.StringReader;
import org.jcodec.codecs.wav.WavHeader;
import org.jcodec.common.Assert;
/**
* This class is part of JCodec ( www.jcodec.org )
* This software is distributed under FreeBSD License
*
* Splits a multichannel wave file into a number of single-channel wavs
*
* @author The JCodec project
*
*/
public class WavSplit {
public static void main(String[] args) throws Exception {
if (args.length < 1) {
System.out.println("Syntax: <file>");
return;
}
File s = new File(args[0]);
WavHeader wavHeader = WavHeader.read(s);
int bits = wavHeader.fmt.bitsPerSample;
int channels = wavHeader.fmt.numChannels;
long rate = wavHeader.fmt.sampleRate;
System.out.println("WAV " + rate + " " + channels + " channels, " + bits + "bit");
Assert.assertEquals(2, wavHeader.fmt.numChannels);
int dataOffset = wavHeader.dataOffset;
BufferedInputStream is = new BufferedInputStream(new FileInputStream(s));
StringReader.sureSkip(is, dataOffset);
OutputStream[] out = new OutputStream[channels];
for (int i = 0; i < channels; i++) {
out[i] = new BufferedOutputStream(new FileOutputStream(new File(s.getParentFile(), String.format("c%02d.wav", i))));
createHeader(wavHeader, bits, channels, rate).write(out[i]);
}
copy(bits, channels, is, out);
for (int i = 0; i < channels; i++) {
out[i].close();
}
}
private static void copy(int bits, int channels, BufferedInputStream is, OutputStream[] out) throws IOException {
int bps = bits >> 3;
byte b[] = new byte[bps];
while (true) {
for (int i = 0; i < channels; i++) {
int read = is.read(b);
if (read != bps)
return;
out[i].write(b);
}
}
}
private static WavHeader createHeader(WavHeader wavHeader, int bits, int channels, long rate) {
WavHeader w = WavHeader.emptyWavHeader();
w.fmt.audioFormat = 1;
w.fmt.bitsPerSample = (short)bits;
w.fmt.blockAlign = (short)(bits >> 3);
w.fmt.byteRate = (short)((rate * bits) >> 3);
w.fmt.numChannels = 1;
w.fmt.sampleRate = (short)rate;
w.dataSize = wavHeader.dataSize / channels;
return w;
}
}