Java: de l'Extraction d'octets du fichier audio
Quelle est la différence entre les deux implémentations dans l'extraction des octets de données à partir d'un fichier audio ?
Le fichier est un .wav
fichier et je veux extraire uniquement les données, sans les en-têtes ou tout autre chose.
Mise en œuvre 1:
public byte[] extractAudioFromFile(String filePath) {
try {
//Get an input stream on the byte array
//containing the data
File file = new File(filePath);
final AudioInputStream audioInputStream = AudioSystem
.getAudioInputStream(file);
byte[] buffer = new byte[4096];
int counter;
while ((counter = audioInputStream.read(buffer, 0, buffer.length)) != -1) {
if (counter > 0) {
byteOut.write(buffer, 0, counter);
}
}
audioInputStream.close();
byteOut.close();
} catch (Exception e) {
System.out.println(e);
System.exit(0);
}//end catch
return ((ByteArrayOutputStream) byteOut).toByteArray();
}
De mise en œuvre de 2:
public byte[] readAudioFileData(String filePath) throws IOException,
UnsupportedAudioFileException {
final AudioInputStream audioInputStream = AudioSystem
.getAudioInputStream(new File(filePath));
AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, byteOut);
audioInputStream.close();
byteOut.close();
return ((ByteArrayOutputStream) byteOut).toByteArray();
}
L'exécution de chaque retourne de différentes taille en octets.
Le premier retour byte[]
avec une longueur de moins de second œuvre.
Que j'essaie d'extraire les octets de données à visualiser le Spectrogramme du fichier.
Aucune explication apprécié.
Merci,
Samer
- Java n'est pas un acronyme, et ne doit pas être écrit en majuscules. De même pour les "données", pour cette question.
Vous devez vous connecter pour publier un commentaire.
La 2ème impl est l'écriture de la pleine VAGUE "format de fichier'. Est la 2e tampon 44 octets plus grande que la première?
[edit: curieux de vraiment l'essayer - le ci-dessus est correcte]
J'ai essayé cela avec cet exemple de fichier WAV.
Résultats:
Note: j'ai pris quelques libertés avec votre extrait de code pour le nettoyer.
System.exit(0)
est évidemment un non-non.if(counter > 0)
n'est pas vraiment nécessaire puisque le compteur doit être supérieure à0
si la valeur de retour de la méthode de lecture n'est pas-1
.