Арифметическая ошибка: / 0
Я не вижу, что я делаю неправильно, я новичок в обработке и продолжает выдавать мне эту ошибку. Там написано, что это код ошибки:
int sampleCount = (int) ((byteCount - 36) / (bitDepth * channels));
это полный класс, это из:
public AudioPlayer (String filename, float sampleRate, PApplet processing) {
//super(filename);
this(sampleRate);
try {
// how long is the file in bytes?
//long byteCount = getAssets().openFd(filename).getLength();
File f = new File(processing.dataPath(filename));
long byteCount = f.length();
//System.out.println("bytes in "+filename+" "+byteCount);
// check the format of the audio file first!
// only accept mono 16 bit wavs
//InputStream is = getAssets().open(filename);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
// chop!!
int bitDepth;
int channels;
boolean isPCM;
// allows us to read up to 4 bytes at a time
byte[] byteBuff = new byte[4];
// skip 20 bytes to get file format
// (1 byte)
bis.skip(20);
bis.read(byteBuff, 0, 2); // read 2 so we are at 22 now
isPCM = ((short)byteBuff[0]) == 1 ? true:false;
//System.out.println("File isPCM "+isPCM);
// skip 22 bytes to get # channels
// (1 byte)
bis.read(byteBuff, 0, 2);// read 2 so we are at 24 now
channels = (short)byteBuff[0];
//System.out.println("#channels "+channels+" "+byteBuff[0]);
// skip 24 bytes to get sampleRate
// (32 bit int)
bis.read(byteBuff, 0, 4); // read 4 so now we are at 28
sampleRate = bytesToInt(byteBuff, 4);
//System.out.println("Sample rate "+sampleRate);
// skip 34 bytes to get bits per sample
// (1 byte)
bis.skip(6); // we were at 28...
bis.read(byteBuff, 0, 2);// read 2 so we are at 36 now
bitDepth = (short)byteBuff[0];
//System.out.println("bit depth "+bitDepth);
// convert to word count...
bitDepth /= 8;
// now start processing the raw data
// data starts at byte 36
int sampleCount = (int) ((byteCount - 36) / (bitDepth * channels));
audioData = new short[sampleCount];
int skip = (channels -1) * bitDepth;
int sample = 0;
// skip a few sample as it sounds like shit
bis.skip(bitDepth * 4);
while (bis.available () >= (bitDepth+skip)) {
bis.read(byteBuff, 0, bitDepth);// read 2 so we are at 36 now
//int val = bytesToInt(byteBuff, bitDepth);
// resample to 16 bit by casting to a short
audioData[sample] = (short) bytesToInt(byteBuff, bitDepth);
bis.skip(skip);
sample ++;
}
float secs = (float)sample / (float)sampleRate;
//System.out.println("Read "+sample+" samples expected "+sampleCount+" time "+secs+" secs ");
bis.close();
// unchop
readHead = 0;
startPos = 0;
// default to 1 sample shift per tick
dReadHead = 1;
isPlaying = false;
isLooping = true;
masterVolume = 1;
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
Это из стандартного класса, который я скачал из класса, как это исправить?
2 ответа
Я думаю (bitDepth * channel) = 0. Вы не можете делить на ноль.
Сначала вам нужно выяснить, какой файл является проблемой. Раскомментируйте строку:
//System.out.println("bytes in "+filename+" "+byteCount);
.. чтобы узнать, какой файл вызывает проблемы. Также раскомментируйте строку:
//System.out.println("File isPCM "+isPCM);
Если isPCM это false
для файла, для которого код нарушается, откройте файл wav в Audacity и экспортируйте его снова. В Audacity он будет явно включать PCM, когда вы сохраняете как тип "WAV (Microsoft) подписанный 16-битный PCM".
Это решило проблему для меня.