Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Multimédia Java Discussion :

Crée un fichier wav au fur et à mesure


Sujet :

Multimédia Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    décembre 2014
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : décembre 2014
    Messages : 153
    Points : 75
    Points
    75
    Par défaut Crée un fichier wav au fur et à mesure
    Bonjours à tout le monde ,

    J'ai un petit problème :

    Je suis en cours de réalisation d'un programme qui enregistre du son, jusque ici pas sorcier.

    Mais une petite question me trotte en tête : quand j'enregistre mon son (grâce à JAVA SOUND , TargetDataLine ...) , je stocke mes octets dans une list pour la capture et au moment ou l'utilisateur à fini son enregistrement, j'utilise AudioImputStream avec ma list pour sauvegarder le tout dans un fichier . Le truc c'est que si l'utilisateur veux enregistrer disons 24h de son (pour exagérer) ma list sera énorme car elle contiendra tout les octets (si j'échantillonne en 44100Hz sa me fera 44100 valeurs par seconde je vous laisse imaginer pour 24h). Je vais donc avoir un souci de mémoire avec le heap si je ne dit pas de bêtise non ?

    J'aurai ce message d'erreur : java.lang.OutOfMemoryError: Java Heap space
    Et on vois nettement la place que les attributs de mes threads grâce au logiciel Java VisualVM.

    Comment faire alors ? Je pense qu'il faut que je créer un fichier wav au fur et à mesure pour ne garder en mémoire vive qu'une seconde de son par exemple mon heap sera donc beaucoup moins charger mais je ne sais pas si cela est possible et si c'est la bonne solution ?

    Merci d'avance pour votre opinion

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    août 2006
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2006
    Messages : 3 925
    Points : 7 722
    Points
    7 722
    Par défaut
    Oui, utilises un buffer de X secondes, qui va se remplir avec ton son capturés. Et une fois atteint une limite, tu écris le buffer dans ton fichier et ainsi de suite.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    décembre 2014
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : décembre 2014
    Messages : 153
    Points : 75
    Points
    75
    Par défaut
    C'est l’idée que j'avais mais qu'entend tu par "écris le buffer dans ton fichier" j'écris au fur et a mesure mon fichier wave avec l’entête d'un wav et les datas qui suive qui seront mis petit à petit ?
    Le problème c'est l’entête du fichier wav qui contient des informations tel que la taille du fichier au final ce que je ne peut pas connaitre au début ...

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    août 2006
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2006
    Messages : 3 925
    Points : 7 722
    Points
    7 722
    Par défaut
    Oui c'est a peu près ça l'idée.

    Après pour ton header, rien ne t'empêche de mettre une durée de 0 puis une fois l'enregistrement terminé, tu modifies l'entête pour avoir la bonne valeur.

    Sinon tu ecris les données brutes (dans le bon format évidement) puis tu rajoute l'entête au début.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    décembre 2014
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : décembre 2014
    Messages : 153
    Points : 75
    Points
    75
    Par défaut
    "Sinon tu ecris les données brutes (dans le bon format évidement) puis tu rajoute l'entête au début."
    Pas bête du tout je n'y avais pas penser. C'est parfois les solutions les plus évidentes qu'on ne trouve pas ^^.
    Je vais essayer ça et je mettrais à jour le sujet une fois réussi si ça intéresse quelqu'un d'autre merci en tout qu'a !

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    décembre 2014
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : décembre 2014
    Messages : 153
    Points : 75
    Points
    75
    Par défaut
    Une petite question pour écrire mon en-tête wav j'utilise DataOutputStream avec writeByte(byte) ou byte, le seul problème c'est que je ne vois pas comment écrire toutes mes données audio puis revenir au début du fichier pour écrire mon en-tête ?

  7. #7
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    août 2006
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2006
    Messages : 3 925
    Points : 7 722
    Points
    7 722
    Par défaut
    2 possibilités :

    - Modifier le fichier originale (tu connais les offset dans le header a modifier je suppose) avec par exemple les RandomAccessFile : https://docs.oracle.com/javase/7/doc...ccessFile.html
    - Réécrire une entête et recopier le contenu du fichier original en lisant a l'offset juste après l'entête originale.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    décembre 2014
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : décembre 2014
    Messages : 153
    Points : 75
    Points
    75
    Par défaut
    Merci je vais essayer ta première option et oui je connais les octets à changer ^^ d’ailleurs si ça intéresse quelqu'un je me suis aidé des sites suivants :
    http://dspace.univ-tlemcen.dz/bitstr.../chapitre4.pdf
    http://col2000.free.fr/vocal/formawav.htm
    http://www.linuxpedia.fr/doku.php/multimedia/format/wav
    http://fsincere.free.fr/isn/python/cours_python_ch9.php

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    décembre 2014
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : décembre 2014
    Messages : 153
    Points : 75
    Points
    75
    Par défaut
    Parfait pour l'en-tête ça fonctionne parfaitement pour commencer j'en écrit une avec de fausse valeurs pour la taille du fichier et après avec RamdomAccessFile j'écrase les anciennes valeurs erronées par les bonnes .
    Par contre j'ai un souci quand j’écris mes données audio car au moment où j’écoute le son une fois l'enregistrement terminer , j'ai plein de parasite comme si on essayer de brouiller mon son ...
    J'utilise la méthode write() de DataOutputStream . Si quelqu'un a une idée je suis preneur .

  10. #10
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    août 2006
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2006
    Messages : 3 925
    Points : 7 722
    Points
    7 722
    Par défaut
    Tes données (hormis la taille) sont elles en correspondances avec ce que tu reçois de l'entrée ? (Nbr de bit, frequences, etc...)
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    décembre 2014
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : décembre 2014
    Messages : 153
    Points : 75
    Points
    75
    Par défaut
    Oui mon en-tête est correct normalement, j'ai enregistré avec un autre logiciel le son avec la même configuration de la carte audio et j'ai ouvert les deux wav avec le logiciel "HxD" qui me permet d'ouvrir les deux fichiers en code hexa et les deux en-tête son identique (sauf la taille bien sur).

  12. #12
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    août 2006
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2006
    Messages : 3 925
    Points : 7 722
    Points
    7 722
    Par défaut
    Mmm difficile a dire. Si tu avais un code minimaliste qui permet de reproduire, je veux bien le tester. (a condition qu'il soit fonctionnel sans chipottes).
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    décembre 2014
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : décembre 2014
    Messages : 153
    Points : 75
    Points
    75
    Par défaut
    Oui j'ai créé une class unique pour le wav relativement simple, le seul truc c'est qu'il faut récupérait les données de ta carte son en octet grâce à TagetDataLine car le reste de mon code et trop brouillon pour le moment avec énormément de class lol. Donc si ça t’intéresse je peux te donner le code de ma class wav ?

  14. #14
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    août 2006
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2006
    Messages : 3 925
    Points : 7 722
    Points
    7 722
    Par défaut
    Bah juste le truc le plus minimaliste qui reproduit la situation ça m'ira
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    décembre 2014
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : décembre 2014
    Messages : 153
    Points : 75
    Points
    75
    Par défaut
    Bonjour,
    Désoler pour mon retard mais j'avais plus accès à mon PC ^^.
    Pour l'exemple de code je sais pas si je vais réussir à faire quelque chose de minimaliste car j'utilise "thread" "observer" et tous ces jolis petit outil pour réaliser mon enregistrement mais "en gros" j’enregistre mes octets un peu de la même façon qu'ici :http://www.developpez.net/forums/d11...n-code-octets/

    au niveau du message du 20/01/2012, 10h21 . La différence c'est qu'au lieu d'afficher l'octet comme dans l’exemple du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (((bytesRead = audioInputStream.read(bytes, 0, bytes.length)) != -1)
    					&& !stop) {
     
    				System.out.println("échantillon : " + bytes[i]);
    				i++;
    			}
    enfin plus sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	public void save8Bit() {
    		int y;
    		while (((bytesRead = targetDataLine.read(audioDataFull, ZERO,
    				audioDataFull.length)) != -UN) && targetDataLine.isOpen()) {
    			y = ZERO;
    			while ((y <= (bytesRead - DEUX)) && (targetDataLine.isOpen())) {
    				ecrire(audioDataFull[y]);
    				ecrire(audioDataFull[y + UN]);
    				y = y + DEUX;
    			}
    		}
    	}
    je l'écris dans mon fichier wav que je crée avec la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void ecrire(byte data){
    	try{
    	outFile.write(data); //outFile est une instance de DataOutputStream()
    	}catch}

  16. #16
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    décembre 2014
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : décembre 2014
    Messages : 153
    Points : 75
    Points
    75
    Par défaut
    Pour donner un meilleur aperçu j'ai enregistré deux fichiers audio de durée quasiment identique et sur le même son (avec un décalage de quelque s ou ms le temps de lancer les enregistrements), un avec un enregistreur normal et un avec celui que je suis en train de coder. J'ai ouvert ensuite les deux fichiers wav avec le logiciel « HxD » et voici ce que ça donne :

    Celui crée par l'enregistreur "normal" :
    Nom : octet2.png
Affichages : 147
Taille : 42,5 Ko

    et le mien :
    Nom : octet1.png
Affichages : 136
Taille : 40,0 Ko

    comme on peut le constater le mien à plein d'octets correspondant à des "......" et je pense que c'est cela qui font parasite.
    Une idée ?

  17. #17
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    décembre 2014
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : décembre 2014
    Messages : 153
    Points : 75
    Points
    75
    Par défaut
    Erreur de ma part il faut ajouter 128 aux octets en 8 bits, car les octets sont non signe alors quand 16 bits oui.

    Donc ça donne en 8 bits:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    outFile.write(data + 128)
    et en 16 :

    Les parasites ainsi disparaissent.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/06/2014, 18h20
  2. Réponses: 1
    Dernier message: 04/05/2011, 09h01
  3. [Audio]Java et fichiers Wav
    Par danael dans le forum Multimédia
    Réponses: 3
    Dernier message: 10/10/2005, 21h09
  4. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 10h43
  5. [Kylix] jouer un fichier wav avec kilyx
    Par JlouisI dans le forum EDI
    Réponses: 1
    Dernier message: 14/06/2002, 03h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo