Копирование файлов WAV
Я скопировал файл WAV, как описано здесь
При попытке воспроизвести мой новый файл, он запускается, но нет звука. Может кто-нибудь помочь? Мой класс по чтению и письму описан в другом посте на сайте:
Это функция, которая читает файл:
// read a wav file into this class
public boolean read(DataInputStream inFile) {
myData = null;
byte[] tmpInt = new byte[4];
byte[] tmpShort = new byte[2];
// byte[] buffer= new byte[offset];
try {
System.out.print(inFile.available());
} catch (IOException ex) {
Logger.getLogger(Wav.class.getName()).log(Level.SEVERE, null, ex);
}
try {
// if (offset!=0)
// inFile.read(buffer, 0,offset);
//System.out.println("Reading wav file...\n"); // for debugging only
String chunkID = "" + (char) inFile.readByte() + (char) inFile.readByte() + (char) inFile.readByte() + (char) inFile.readByte();
inFile.read(tmpInt); // read the ChunkSize
myChunkSize = byteArrayToIntLittle(tmpInt);
String format = "" + (char) inFile.readByte() + (char) inFile.readByte() + (char) inFile.readByte() + (char) inFile.readByte();
// print what we've read so far
//System.out.println("chunkID:" + chunkID + " chunk1Size:" + myChunkSize + " format:" + format); // for debugging only
String subChunk1ID = "" + (char) inFile.readByte() + (char) inFile.readByte() + (char) inFile.readByte() + (char) inFile.readByte();
inFile.read(tmpInt); // read the SubChunk1Size
mySubChunk1Size = byteArrayToIntLittle(tmpInt);
inFile.read(tmpShort); // read the audio format. This should be 1 for PCM
myFormat = byteArrayToShortLittle(tmpShort);
inFile.read(tmpShort); // read the # of channels (1 or 2)
myChannels = byteArrayToShortLittle(tmpShort);
inFile.read(tmpInt); // read the samplerate
mySampleRate = byteArrayToIntLittle(tmpInt);
inFile.read(tmpInt); // read the byterate
myByteRate = byteArrayToIntLittle(tmpInt);
inFile.read(tmpShort); // read the blockalign
myBlockAlign = byteArrayToShortLittle(tmpShort);
inFile.read(tmpShort); // read the bitspersample
myBitsPerSample = byteArrayToShortLittle(tmpShort);
// print what we've read so far
System.out.println("SubChunk1ID:" + subChunk1ID + " SubChunk1Size:" + mySubChunk1Size + " AudioFormat:" + myFormat + " Channels:" + myChannels + " SampleRate:" + mySampleRate);
inFile.read(tmpShort);
extraParams= byteArrayToShortLittle(tmpShort);
// read the data chunk header - reading this IS necessary, because not all wav files will have the data chunk here - for now, we're just assuming that the data chunk is here
String dataChunkID = "" + (char) inFile.readByte() + (char) inFile.readByte() + (char) inFile.readByte() + (char) inFile.readByte();
inFile.read(tmpInt); // read the size of the data
myDataSize = byteArrayToIntLittle(tmpInt);
// read the data chunk
myData = new byte[(int) myDataSize];
// close the input stream
inFile.close();
} catch (Exception e) {
System.out.print(e);
return false;
}
return true;
}
Затем, чтобы сохранить его как новый WAV-файл, я использую эту функцию:
public boolean save() {
try {
// Creating the file
File file = new File(myPath);
boolean isCreated = false;
try {
isCreated = file.createNewFile();
if (!isCreated) {
file.delete();
file.createNewFile();
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
DataOutputStream outFile = new DataOutputStream(new FileOutputStream(myPath));
// write the wav file per the wav file format
outFile.writeBytes("RIFF"); // 00 - RIFF
outFile.write(intToByteArray((int) myChunkSize), 0, 4); // 04 - how big is the rest of this file?
outFile.writeBytes("WAVE"); // 08 - WAVE
outFile.writeBytes("fmt "); // 12 - fmt
outFile.write(intToByteArray((int) mySubChunk1Size), 0, 4); // 16 - size of this chunk
outFile.write(shortToByteArray((short) myFormat), 0, 2); // 20 - what is the audio format? 1 for PCM = Pulse Code Modulation
outFile.write(shortToByteArray((short) myChannels), 0, 2); // 22 - mono or stereo? 1 or 2? (or 5 or ???)
outFile.write(intToByteArray((int) mySampleRate), 0, 4); // 24 - samples per second (numbers per second)
outFile.write(intToByteArray((int) myByteRate), 0, 4); // 28 - bytes per second
outFile.write(shortToByteArray((short) myBlockAlign), 0, 2); // 32 - # of bytes in one sample, for all channels
outFile.write(shortToByteArray((short) myBitsPerSample), 0, 2); // 34 - how many bits in a sample(number)? usually 16 or 24
outFile.write(shortToByteArray((short) extraParams), 0, 2);
outFile.writeBytes("data"); // 36 - data
outFile.write(intToByteArray((int) myDataSize), 0, 4); // 40 - how big is this data chunk
outFile.write(myData); // 44 - the actual data itself - just a long string of numbers
System.out.print("size of wav "+ outFile.size()+ "\n");
outFile.close();
} catch (Exception e) {
System.out.println(e);
return false;
}
return true;
}
1 ответ
Вы игнорируете счет, возвращаемый каждым чтением (). Не обязан передавать более одного байта. Вы должны использовать DataInputStream.readFully (), чтобы гарантировать, что все буферы заполнены.
Однако, если вы не изменяете данные, которые вы не указали, в этом нет необходимости. Просто скопируйте байты со стандартным циклом копирования из пяти строк.
Примечание: вам не нужны все вещи, которые существуют ()/isCreated()/delete(). 'new FileOutputStream()' уже делает все это.