IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Enregister en audio et affciher le niveau sonore en même temps


Sujet :

Multimédia Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Février 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Février 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Enregister en audio et affciher le niveau sonore en même temps
    Bonjour je réalise un simple enregistreur dans lequel je souhaite afficher le niveau sonore dans une JProgressBar et dans le même temps enregistrer le signal dans un fichier.
    Pour l'instant je n'arrive à faire que l'un ou l'autre mais pas les deux en même temps.

    Pour afficher le niveau j'ai recours à la methode line.read dans lequel je manipule dans une boucle while le buffer pour afficher ma JProgressBar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       while(!stopCaptureSignal){
    	   int cnt=line.read(tempBuffer,0,tempBuffer.length);
    	   if (cnt>0){
                      progressBar.setValue((int)(calculateRMSLevel(tempBuffer)));
                }
      }
    Pour enregistrer le fichier je n'ai trouvé que la méthode write

    AudioInputStream ais = new AudioInputStream(line);
    AudioSystem.write(ais, fileType, wavFile);

    qui est de "haut niveau" et ne permet pas de manipulation. Il n'y a pas de boucle permettant d"afficher le niveau au fur et à mesure de la capture

    Si je lance 2 threads un pour le AudioStream.write et un pour le line.read évidemment le fichier audio obtenu est inaudible puisqu'il manque les données correspondant à tous les buffers utilisés par le line.read pour afficher la JProgressBar

    Y a t il un moyen pour écrire le fichier audio à partir de la boucle line.read sans avoir recours à AudioSystem.write ? ou bien d'ouvrir 2 TargetDataLines à partir de la même source audio ?

    J'ai fouillé sur le net et je ne trouve rien sur ce sujet pourtant assez basique.

    Merci de vos lumières.

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Février 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Février 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    J'ai essayé l'architecture AudioOutputStream du projet Tritonus qui met à disposition une méthode write permettant d'écrire bloc par bloc le fichier audio.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    	class CaptureThreadSignal extends Thread {
    		public void run(){
    			try {
    			    byte tempBuffer[]=new byte[line.getBufferSize()/5];
    			    AudioFormat format = getAudioFormat();
    			    line.open(format);
    			    line.start();
     
    			    dataOutputStream = null;
    			    audioOutputStream = null;
    			    dataOutputStream = AudioSystemShadow.getDataOutputStream(wavFile);
    			    audioOutputStream = AudioSystemShadow.getAudioOutputStream(fileType, format, AudioSystem.NOT_SPECIFIED,dataOutputStream);
    			    StopCaptureSignal = false;
     
    			    while(!stopCaptureSignal){
    			    int cnt=line.read(tempBuffer,0,tempBuffer.length);
    			      if (cnt>0){
    			    	  if (startWrite){
    	     		   	    	 int nBytesWritten = audioOutputStream.write(tempBuffer, 0, tempBuffer.length);
    	     		   	     }
    	       		   	     progressBar.setValue((int)(calculateRMSLevel(tempBuffer)/327.67));
                                         // divided by 32767 (because 16bit data) and mutiplied by 100 to get a 0-100 progressbar value		       	    
    			      }//end if
    			    }//end while
     
    				line.stop();
    				line.close();
     
    			}catch (Exception ex){
    				ex.printStackTrace();
    			}
    		}
    	}
    ça fonctionne. j'ai bien mon fichier audio et l'affichage du niveau sur la JProgressBar, mais par contre il manque quelques millisecondes par ci par là dans le fichier audio qui du coup n'est pas très audible.

    J'ai essayé de changer la taille du buffer mis ici à byte tempBuffer[]=new byte[line.getBufferSize()/5]; Valeur recommandée par Oracle dans l'API Java Sound. J'ai essayé byte tempBuffer[]=new byte[line.getBufferSize()/2 et byte tempBuffer[]=new byte[line.getBufferSize()/10 sans noter d'amélioration.

    Je ne comprends pas pourquoi je ne capture pas tout l'audio.
    Dans la boucle j'écris le tempBuffer dès que je l'ai lu et je ne calcule/affiche la JProgressBar qu'après.

    A moins que le calcul/affichage ne prenne trop de temps pour aller lire le buffer suivant.
    Ou bien que la méthode audioOutputStream.write de Tritonus ne marche pas : elle est qualifiée d'expérimentale.

    Avez-vous une idée ?

Discussions similaires

  1. Niveau sonore baisse tout seul
    Par Daejung dans le forum Windows Vista
    Réponses: 3
    Dernier message: 24/08/2010, 13h03
  2. Réponses: 1
    Dernier message: 24/03/2009, 09h26
  3. [Audio] Diffusion d'un message sonore
    Par mimi51340 dans le forum Multimédia
    Réponses: 12
    Dernier message: 10/06/2008, 12h55
  4. macro pour le niveau sonore windows
    Par sabine342 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/09/2007, 17h41
  5. recépération de niveau sonor
    Par marc79 dans le forum DirectX
    Réponses: 1
    Dernier message: 11/10/2006, 20h15

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