[Java] Lire des donnees d'un fichier son .wav

warith -  
sepehr_gsfc Messages postés 9 Statut Membre -
Bonjour a tous,

J'aimerai lire les donnees d'un fichier son .wav ou autre (.au, .aif ...) c'est-a-dire mettre le signal echantillonne dans un tableau de double (double []) et recueillir la frequence d'echantillonnage aussi dans un double.

Aujourd'hui, je passe par Matlab et une commande wavread et j'ecris le contenu dans un fichier .txt qui est ensuite lu par Java. Je suis a la recherche d'une methode plus directe : entre Java et le fichier sonore.

Merci d'avance
A voir également:

11 réponses

mamiemando Messages postés 34229 Date d'inscription   Statut Modérateur Dernière intervention   7 897
 
Dans ma jeunesse (genre ya deux ans) j'avais fait un petit player en C. Lire un wav n'est pas très compliqué du moment que tu as la structure du fichier (en gros un header et ensuite les trames).

Le header te donne l'échatillonage, le nombre de canaux etc... Tout ce qu'il te faut pour initialiser correctement la carte son avec des ioctl en C ;o). La première étape c'est donc de trouver ça (google est ton ami ;o) )

Ensuite une petite boucle for et tu récupères les trames une par une. Si la carte son est bien initialisée tu obtiens un truc audible au bout du compte ;o)

Je ne connais pas assez Java pour te dire si l'équivalent des ioctl existe, mais en tout cas en C c'est faisable et pas aussi compliqué qu'on pourrait le croire.
2
warith
 
Merci pour vos reponses
Je me renseigne sur l equivalent de ioctl en Java.

Cependant :
- je ne comprends pas pourquoi il y a besoin de faire intervenir la carte son alors que je veux juste manipuler un fichier .wav sur mon disque dur...

- peut etre qu il faut analyser comment est constitue un fichier .wav pour ensuite savoir le "traduire".
J ai tente de forcer la lecture sur Notepad ou Wordpad et meme Java en considerant mon fichier .wav comme un .txt mais j obtiens n'importe quoi : RIFF.€*€€€€€€€uuu€u€d€€d€ etc

- N est-il pas possible d acceder directement au signal et la frequence d echantillonnage sur des formats sonores de Sun genre .au ? Je dis ca car Java Sound est cense etre fait pour le DSP (Digital Signal Processing)

Malheureusement ces reponses restent sans reponse malgre des heures passees sur Google.

Merci encore une fois du savoir que vous partagez et du temps que vous me consacrer. ;-)
0
mamiemando Messages postés 34229 Date d'inscription   Statut Modérateur Dernière intervention   7 897 > warith
 
Merci pour vos reponses
Je me renseigne sur l equivalent de ioctl en Java.

Cependant :
- je ne comprends pas pourquoi il y a besoin de faire intervenir la carte son alors que je veux juste manipuler un fichier .wav sur mon disque dur...


--> Tu parlais de lire un wav. Moi j'ai compris lire dans le sens "jouer un son". Sous linux si tu fait un cat fichier.wav > /dev/dsp ca te donne un tuc inaudible car tu n'as pas passé d'ioctl pour initialiser correctement la carte son.

Car sinon un fichier wav se lit comme un fichier classique.

- peut etre qu il faut analyser comment est constitue un fichier .wav pour ensuite savoir le "traduire".

Pour voir comment lire un fichier bytes par bytes :
http://www.commentcamarche.net/forum/affich-1477971-%5Bjava%5D-lire-byte-par-byte-un-fichier

Pour la structure du header wav :
http://www.neurotraces.com/scilab/scilab2/node24.html

La question est que veux tu faire ??? Car en effet le header ne sert qu'à initialiser une la carte son lorsque tu veux le jouer et rien d'autre. Si ça se trouve tu n'en as pas besoin ;o)


J ai tente de forcer la lecture sur Notepad ou Wordpad et meme Java en considerant mon fichier .wav comme un .txt mais j obtiens n'importe quoi : RIFF.€*€€€€€€€uuu€u€d€€d€ etc


C'est normal ! Un fichier quel qu'il soit est une suite de 0 et de 1. Tout dépend du sens que tu lui donne (la c'est des caractères), mais pour un wav ça n'a pas de sens. Cf la manière de le lire ton wav ci-dessus...

- N est-il pas possible d acceder directement au signal et la frequence d echantillonnage sur des formats sonores de Sun genre .au ? Je dis ca car Java Sound est cense etre fait pour le DSP (Digital Signal Processing)

Cf le header de ton fichier wav

Bonne chance
0
warith
 
Je crois que je commence a comprendre.
Il faut lire le fichier en mode binaire et non texte et ensuite extraire bit par bit ou mot par mot la totalite du fichier.

C est bien ca ??
1
choubaka Messages postés 39986 Date d'inscription   Statut Modérateur Dernière intervention   2 105
 
salut

je ne sais pas si ça peut t'aider

http://www.developer.com/java/other/article.php/1565671
0
sam3000 Messages postés 1226 Statut Membre 144
 
le format d'un fichier .wav est binaire (il y a bien une structure, c'est des fichiers à bases d'enregistrement de base RIFF)
tu ne peut pas trouver des donnees en texte, tu doit lire les donnees comme des nombres (en C on utilise fread( ) )
une remarque pourtant: les .wav contiennent seulement des echantiollons (la frequence d'echationnage est fixe pour un fichier donnée, et tu trouve l'information dans l'entete du fichier, pres du RIFF :) )
si tu as besoin du format de fichier (et tu as chercher, sans trouver) demande et je chercherais avec toi
0
warith
 
Je suis vraiment navre apparemment j aurai du etre plus clair.

En fait, on me demande de faire un logiciel JAVA qui fait les partitions musicales a partir d un fichier .wav.

Pour cela j ai besoin de deux choses :

- frequence d echantillonnage sous la forme d un double

- le signal echantillonne sous la forme d un tableau de reels (double [])

Que tout le monde se rassure, j ai deja compris la theorie (qui n est pqs de moi : / ) qui est utilisee ensuite pour obtenir les partitions.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sam3000 Messages postés 1226 Statut Membre 144
 
le fichier WAV c'est ça en gros:
[ENTETE][ECHANTILLONS]

-L'entte contient la freq d'echant., la taille des echantiollons, leur nombre (entre autre)
- les donnees c'est un tableau (d'octets si c'est un fichier 8bits, mots si c'est un fichier 16bits) signés
0
sam3000 Messages postés 1226 Statut Membre 144
 
oui, dison octet par octet ou mot par mot
mais il ne faut pas oublier d'analyser l'entete en premier
0
mamiemando Messages postés 34229 Date d'inscription   Statut Modérateur Dernière intervention   7 897
 
C'est ca warrith : tout fichier quel qu'il soit n'est qu'une suite de 0 et de 1. Après tu donnes à cette suite le sens que tu veux.

Dans un fichier wav, les premiers octets forment le fameux header wav (dont tu peux trouver le prototype sur google... ) Je crois même qu'un des liens que j'ai posté t'envoie direct à une page qui va bien.

Donc tu lis byte par byte ton fichier, tu remplis en conséquences un objet HeaderWav (par exemple) dont les attributs de classes sont les attributs caractérisant un wav. Ensuite, il ne te reste plus qu'à construire un liste d'objets "Trame" qui correspond à une partie de ton son (qq millisecondes, je n'ai plus le chiffre en tête).

Si ça t'interesse je dois pouvoir trouver chez moi un morceau de code qui lit un fichier wav (mais en C)...
0
Erkan37
 
Salut,


Quelles sont les valeurs qui vont être utile pour créer un spectre du fichier wav? c'est a dire que représente les points qui sont sur la courbe du spectre??


Merciii
0
bourriquet
 
Salut,

Je voudrais en gros la même chose : prendre un fichier wave et obtenir une courbe représentant le son.
Et je sais comment le faire.

Mais je voudrais savoir s'il n'y a pas des trucs déjà fait pour faire ça?
Parce que ça doit servir pour tellement de trucs (désolé pour les "trucs")...
Et j'ai pas envie de perdre mon temps à faire ça si c'est déjà fait vu que c'est pas le but final.

Sinon pour la structure des wav, j'ai trouvé ça qui est très bien : http://tuxy2885.free.fr/index.php?cat=tutorial&id=riffwave
0
mamiemando Messages postés 34229 Date d'inscription   Statut Modérateur Dernière intervention   7 897
 
0
sepehr_gsfc Messages postés 9 Statut Membre
 
il faut utiliser JMF: https://www.oracle.com/java/technologies/javase/java-media-framework.html
Tu dois télécharger le JMF, l'installer et ajouter ses .jar à ton projet.

un bout de code que j'ai écrit :

File file = new File(fileName);
Player player = Manager.createRealizedPlayer(file.toURI().toURL());
player.start();
0