Actualité informatique
Test comparatif matériel informatique
Jeux vidéo
Astuces informatique
Vidéo
Télécharger
Services en ligne
Forum informatique
01Business



|||-  

traitement du son sous java

 

1 utilisateur anonyme
Ajouter une réponse
 

 
Page photos
 
     
Vider la liste des messages à citer
 
 Page :
1
Auteur
 Sujet :

traitement du son sous java

Prévenir les modérateurs en cas d'abus 
babanjida
babanjida
Présent de temps en temps (De 50 à 99 messages postés)
  1. Posté le 03/12/2006 à 20:04:17  
  1. answer
  1. Prévenir les modérateurs en cas d'abus
 
Salut à tous,

 Je cherche à construire un programme qui me permet de lire le son à partir de la carte son, puis le reenvoyer directement à la carte son: comme le fonctionnement du haut parleur.

 alors ce programme ne doit pas enregistrer sur le disque dire.
 J'ai exploité la bibliothéque de son de java, mais ou bien je trouve des classes qui permettent de lire à partire du disque dure, ou bien qui permettent d'en enregistrer.

 Merci pour tous ceux qui vont m'aider.

minus-et-cortex
Débutant confirmé (de 1 000 à 4 999 messages postés)
  1. Posté le 03/12/2006 à 20:49:28  
  1. answer
  1. Prévenir les modérateurs en cas d'abus
 
Salut!

 Je ne me suis jamais penché qur ce genre de trucs, mais tu as regardé quelles classes (quel paquetage) ? As-tu regardé du côté de javax.sound.sampled ?

 @+

(Publicité)
babanjida
Présent de temps en temps (De 50 à 99 messages postés)
  1. Posté le 03/12/2006 à 22:45:58  
  1. answer
  1. Prévenir les modérateurs en cas d'abus
 
Salut,

 J'ai éffectué un recherche dans le Package "javax.sound.sampled". Alors j'ai réussit à construir une application pour l'enregistrement de l'audio, et une autre pour jouer les fichiers ".wav", mais je n'ai pas réussi à construire l'application principale qui permet de lire et diffuser le son simultanément.

 Le but de cette application est de jouer le role du microphone qui permet d'amplifier le signale d'entré en temps réel.

 svp essayez de m'aider.

minus-et-cortex
Débutant confirmé (de 1 000 à 4 999 messages postés)
  1. Posté le 03/12/2006 à 22:59:30  
  1. answer
  1. Prévenir les modérateurs en cas d'abus
 
Tu as moyen de mettre ton code en ligne s'il te plaît ?

babanjida
Présent de temps en temps (De 50 à 99 messages postés)
  1. Posté le 03/12/2006 à 23:20:37  
  1. answer
  1. Prévenir les modérateurs en cas d'abus
 
Le class suivant permet l'enregistrement:
 -------------


 import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
 import java.io.IOException;

 import javax.sound.sampled.AudioFileF​ormat;
 import javax.sound.sampled.AudioForma​t;
 import javax.sound.sampled.AudioInput​Stream;
 import javax.sound.sampled.AudioSyste​m;
 import javax.sound.sampled.DataLine;
 import javax.sound.sampled.LineUnavai​lableException;
 import javax.sound.sampled.TargetData​Line;


 public class AudioRecorder implements Runnable {

private TargetDataLine line;

private AudioFormat audioFormat;

private static final AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE;

private OutputStream VerBaffle;

public void init() {

audioFormat = new AudioFormat(8000, 8, 1, true, true);

// En plus du format du flux audio d'entrée il est nécessaire de

// spécifier le type de DataLine qu'on veut

// ici le DataLine qu'on souhaite est un SourceDataLine qui permet

// la

// lecture (targetDataLine permet l'enregistrement).

//la ligne d'aprés va tester si le format de l'audio introduite est acceptable ou non:

DataLine.Info info = new DataLine.Info(TargetDataLine.c​lass,audioFormat);

if (!AudioSystem.isLineSupported(​info))

{

System.err.println("Audio Format specified is not supported" );

return;

}

// On récupère le DataLine adéquat

try {

line = (TargetDataLine) AudioSystem.getLine(info);

} catch (LineUnavailableException e) {

e.printStackTrace();

return;

}

}

public void run() {

// on ouvre le Dataline

try {

line.open(audioFormat);

} catch (LineUnavailableException e1) {

e1.printStackTrace();

return;

}

// pour que le flux soit effectivement redirigé sur la carte son il

// faut

// demarrer la ligne

line.start();

AudioInputStream audioInputStream = new AudioInputStream(line);

try {

AudioSystem.write(audioInputSt​ream, targetType, VerBaffle);

} catch (IOException e1) {

e1.printStackTrace();

} finally {

line.close();

try {

audioInputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

line.stop();

line.close();

}

public TargetDataLine getLine() {

return line;

}

 }
 ______________________________​______________________________​________
 Le class suivant permet la lecture:
 ---------------------
 import java.io.File;
 import java.io.IOException;

 import javax.sound.sampled.AudioForma​t;
 import javax.sound.sampled.AudioInput​Stream;
 import javax.sound.sampled.AudioSyste​m;
 import javax.sound.sampled.DataLine;
 import javax.sound.sampled.LineUnavai​lableException;
 import javax.sound.sampled.SourceData​Line;
 import javax.sound.sampled.Unsupporte​dAudioFileException;

 public class AudioPlayer implements Runnable {

private SourceDataLine line;

private File file;

private AudioInputStream audioInputStream;

private AudioFormat audioFormat;

private boolean stop=false;

public void stop() {

stop=true;

}

public void init(){

try {

audioInputStream = AudioSystem.getAudioInputStrea​m(file);

} catch (UnsupportedAudioFileException e) {

e.printStackTrace();

return;

} catch (IOException e) {

e.printStackTrace();

return;

}

//Il est nécessaire de connaître le format audio du fichier

// d'entrée

// pour permettre à java de créer l'objet DataLine adéquat

audioFormat = audioInputStream.getFormat();

//System.out.println(audioForm​at);

// En plus du format du flux audio d'entrée il est nécessaire de

// spécifier le type de DataLine qu'on veut

// ici le DataLine qu'on souhaite est un SourceDataLine qui permet

// la

// lecture (targetDataLine permet l'enregistrement).

DataLine.Info info = new DataLine.Info(SourceDataLine.c​lass,

audioFormat);

// On récupère le DataLine adéquat et on l'ouvre

try {

line = (SourceDataLine) AudioSystem.getLine(info);

} catch (LineUnavailableException e) {

e.printStackTrace();

return;

}

}

public void run() {

stop = false;

// Avant toute chose il est nécessaire d'ouvrir la ligne

try {

line.open(audioFormat);

} catch (LineUnavailableException e) {

e.printStackTrace();

return;

// TODO Auto-generated catch block

}

// pour que le flux soit effectivement redirigé sur la carte son il

// faut

// demarrer la ligne

line.start();

// il faut maintenant écrire sur la ligne. Travail comme sur un

// inputStream quelconque

try {

byte bytes[] = new byte[1024];

int bytesRead=0;

while (((bytesRead = audioInputStream.read(bytes, 0, bytes.length)) != -1)//les changements doivent être ici

&& !stop) {

line.write(bytes, 0, bytesRead);

}

} catch (IOException io) {

io.printStackTrace();

return;

}

// on ferme la ligne à la fin

line.close();

}

public void setFile(File file) {

this.file = file;

}

public SourceDataLine getLine() {

return line;

}


 }
 ______________________________​______________________________​________
 Ce denier class est le principale, et avant l'éxecution tu doit lui importer 4 images: load.png, play.png, record.png, stop.png, sinon les boutons seron vides
 --------------------

 import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.event.ActionEvent;
 import java.io.File;

 import javax.sound.sampled.LineEvent;
 import javax.sound.sampled.LineListen​er;
 import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.ImageIcon;
 import javax.swing.JFileChooser;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JToolBar;
 import javax.swing.filechooser.FileFi​lter;


 public class AudioRecorderPlayerGUI {

private Thread audioPlayerThread;

private AudioPlayer player;

private Thread audioRecorderThread;

private AudioRecorder recorder;

private Action load;

private Action play;

private Action stop;

private Action record;

private JFrame frame;

private JPanel contentPane;

private JFileChooser chooser;

private File audioPlayFile;

private File audioRecordFile;

private JLabel playTitle;

private JLabel recordTitle;

public AudioRecorderPlayerGUI(){

player=new AudioPlayer();

recorder=new AudioRecorder();

frame = new JFrame("AudioRecorder+Player" )​;

contentPane = new JPanel(new BorderLayout());

chooser = new JFileChooser();

chooser.setFileFilter(new FileFilter() {

// @Override

public boolean accept(File f) {

if (f.getName().endsWith(".wav" ))

return true;

else

return false;

}

//@Override

public String getDescription() {

return null;

}

});

contentPane.setPreferredSize(n​ew Dimension(300, 150));

stop = new AbstractAction() {

public void actionPerformed(ActionEvent arg0) {

if(player!=null) player.stop();

if(recorder!=null) recorder.getLine().stop();

}

};

stop.putValue(Action.SMALL_ICO​N, new ImageIcon("stop.png" ));

play= new AbstractAction() {

public void actionPerformed(ActionEvent arg0) {

//player.setFile(audioPlayFile​);

player.init();

audioPlayerThread = new Thread(player);

audioPlayerThread.start();

player.getLine().addLineListen​er(new LineListener(){

public void update(LineEvent le) {

if(le.getType()==LineEvent.Typ​e.STOP || le.getType()==LineEvent.Type.C​LOSE){

play.setEnabled(true);

record.setEnabled(true);

stop.setEnabled(false);

}

if(le.getType()==LineEvent.Typ​e.START){

play.setEnabled(false);

record.setEnabled(false);

stop.setEnabled(true);

}

}

});

}

};

play.putValue(Action.SMALL_ICO​N, new ImageIcon("play.png" ));

load = new AbstractAction() {

public void actionPerformed(ActionEvent arg0) {

int returnVal = chooser.showOpenDialog(frame);

if (returnVal == JFileChooser.APPROVE_OPTION) {

audioPlayFile=chooser.getSelec​tedFile();

player.setFile(audioPlayFile);

player.init();

playTitle.setText("Fichier en liste de lecture: "+ audioPlayFile.getName());

contentPane.paintAll(contentPa​ne.getGraphics());

}

}

};

load.putValue(Action.SMALL_ICO​N, new ImageIcon("load.png" ));

record=new AbstractAction(){

public void actionPerformed(ActionEvent arg0) {

if (true) {

recorder.init();

audioRecorderThread = new Thread(recorder);

audioRecorderThread.start();

record.setEnabled(false);

}else return;

}

};

record.putValue(Action.SMALL_I​CON, new ImageIcon("record.png" ));

JToolBar toolbar = new JToolBar();

toolbar.add(load);

toolbar.add(play);

toolbar.add(stop);

toolbar.add(record);

playTitle=new JLabel("Lecture: Aucun fichier chargé" );

recordTitle=new JLabel("Enregistrement: Aucun fichier chargé" );

contentPane.add(toolbar, BorderLayout.NORTH);

contentPane.add(playTitle,Bord​erLayout.CENTER);

contentPane.add(recordTitle,Bo​rderLayout.SOUTH);

frame.setContentPane(contentPa​ne);

frame.setDefaultCloseOperation​(JFrame.EXIT_ON_CLOSE);

frame.pack();

frame.setVisible(true);

}

/**

* @param args

*/

public static void main(String[] args) {

new AudioRecorderPlayerGUI();

}

 }
 ______________________________​______________________________​__________


 j'éspère qui je trouve une solution pour ce probléme. S'il vous plais, n'hésiter pas de m'aider.


(Publicité)
babanjida
Présent de temps en temps (De 50 à 99 messages postés)
  1. Posté le 04/12/2006 à 17:46:42  
  1. answer
  1. Prévenir les modérateurs en cas d'abus
 
Les classes permettants de construir une ligne (line), disponibles dans le package javax.sound.sampled, sont:

* TargetDataLine

* SourceDataLine
 Et aucune de ces deux classes ne permet de lire et diffuser simultanément la voix.
 Je sais que la classe DataLine est la classe mére de ces deux classes indiqués, mais je ne sais pas si elle est utile ou pas, et de plus je n'arrive pas à bien familiariser avec elle.

 Si quelqu'un peut m'aider n'hésitez pas, car ça fait part de mon projet de fin d'année et je suis encore au point de départ.

minus-et-cortex
Débutant confirmé (de 1 000 à 4 999 messages postés)
  1. Posté le 04/12/2006 à 20:40:17  
  1. answer
  1. Prévenir les modérateurs en cas d'abus
 
Salut!

 J'essaye de comprendre comment fonctionne ton programme, et il me semble avoir relevé deux erreurs :
 - dans la classe principale, il faut ajouter au FileFilter du JFileChooser l'affichage des répertoires :



chooser.setFileFilter(new FileFilter() {
   // @Override
   public boolean accept(File f) {
       if (f.getName().endsWith(".wav" ) || f.isDirectory())
    return true;
       else
    return false;
   }

   //@Override
   public String getDescription() {
       return null;
   }
      });



 - dans la classe AudioRecorder, je pense que le flux de sortie VerBaffle n'est jamais initialisé, ce qui fait qu'on lève une exception quand on lance ce thread. Il faudrait une méthode, comme celle que tu as faite dans l'AudioPlayer, setFile() ou setOutputStream().

 Je continue à regarder, mais je me demande s'il ne serait pas possible d'utiliser un tube (classes PipedOutputStream et PipedInputStream) pour lier les flux d'entrée et de sortie.

 @+

minus-et-cortex
Débutant confirmé (de 1 000 à 4 999 messages postés)
  1. Posté le 05/12/2006 à 00:39:51  
  1. answer
  1. Prévenir les modérateurs en cas d'abus
 
En théorie, pour lire un fichier son, tu lis le contenu du fichier et tu l'écris sur la ligne que tu as créée avec les paramètres qui vont bien. Pour la capture, tu lis depuis la ligne qui va bien et tu écris dans un flux sortant. Ce que tu peut faire, c'est :
 - dans le player, au lieu de créer l'audioInputStream depuis unu fichier, créé le depuis un stream. Remplace dans le init()



audioInputStream = AudioSystem.getAudioInputStrea​m(file);


par



audioInputStream = AudioSystem.getAudioInputStrea​m(myPipedInputStream);


L'objet myPipedInputStream est un bout du tube (classe PipedInputStream) et l'autre bout sera l'objet myPipedOutputStream qui sera utilisé dans le Recorder. D'ailleurs (mais je peux me tromper) je pense le run de ton recorder est mal écrit : tu lit depuis la ligne TargetDataLine et tu écris dans un stream. Cette parenthèse passée, tu liras les données capturées depuis le mixer sur la TargetDataLine et tu les écriras dans myPipedOutputStream, donc dans le tube, donc elles seront directement lues par le player (à l'autre bout du tube). Cela te permettra de lire les données du microphone par exemple directement en sortie de la carte son (enfin c'est ce qu'il me semble avoir compris).

 Je t'invite à jeter un oeil sur ce lien : http://java.sun.com/j2se/1.5.0 [...] pter5.html



// Assume that the TargetDataLine, line, has already
 // been obtained and opened.
 ByteArrayOutputStream out  = new ByteArrayOutputStream();
 int numBytesRead;
 byte[] data = new byte[line.getBufferSize() / 5];

 // Begin audio capture.
 line.start();

 // Here, stopped is a global boolean set by another thread.
 while (!stopped) {

// Read the next chunk of data from the TargetDataLine.

numBytesRead =  line.read(data, 0, data.length);

// Save this chunk of data.

out.write(data, 0, numBytesRead);
 }


(Publicité)
babanjida
Présent de temps en temps (De 50 à 99 messages postés)
  1. Posté le 07/12/2006 à 16:57:49  
  1. answer
  1. Prévenir les modérateurs en cas d'abus
 
Merci pour tous vos aides mais je n'arrive pas à bien positionner les changements, pouvez vous me préciser éxactement les positions du changement pour la classe AudioRecorder?

minus-et-cortex
Débutant confirmé (de 1 000 à 4 999 messages postés)
  1. Posté le 07/12/2006 à 18:10:08  
  1. answer
  1. Prévenir les modérateurs en cas d'abus
 
Salut!

 J'ai modifié tes trois classes :
 



/*____________________________​______________________________​__________
  Le class suivant permet la lecture:
  ---------------------*/
 import java.io.File;
 import java.io.IOException;
 import java.io.PipedInputStream;

 import javax.sound.sampled.AudioForma​t;
 import javax.sound.sampled.AudioInput​Stream;
 import javax.sound.sampled.AudioSyste​m;
 import javax.sound.sampled.DataLine;
 import javax.sound.sampled.LineUnavai​lableException;
 import javax.sound.sampled.SourceData​Line;
 import javax.sound.sampled.Unsupporte​dAudioFileException;

 public class AudioPlayer implements Runnable {

private SourceDataLine line;

private File file;

private PipedInputStream pipedIn = null;

private AudioInputStream audioInputStream;

private AudioFormat audioFormat;

private boolean stop=false;

public void stop() {
  stop=true;

}

public void init(){
  /*
  try {
      audioInputStream = AudioSystem.getAudioInputStrea​m(file);

  } catch (UnsupportedAudioFileException e) {
      e.printStackTrace();
      return;
  } catch (IOException e) {
      e.printStackTrace();
      return;
  }
  */

  //Il est nécessaire de connaître le format audio du fichier
  // d'entrée
  // pour permettre à java de créer l'objet DataLine adéquat
  /*
    audioFormat = audioInputStream.getFormat();
  */
  audioFormat = new AudioFormat(8000, 8, 1, true, true);
  //System.out.println(audioForm​at);

  // En plus du format du flux audio d'entrée il est nécessaire de
  // spécifier le type de DataLine qu'on veut
  // ici le DataLine qu'on souhaite est un SourceDataLine qui permet
  // la
  // lecture (targetDataLine permet l'enregistrement).

  DataLine.Info info = new DataLine.Info(SourceDataLine.c​lass,
             audioFormat);

  // On récupère le DataLine adéquat et on l'ouvre
  try {
      line = (SourceDataLine) AudioSystem.getLine(info);

  } catch (LineUnavailableException e) {
      e.printStackTrace();
      return;
  }

}

public void run() {

  if (pipedIn == null)
      return;

  stop = false;
  // Avant toute chose il est nécessaire d'ouvrir la ligne
  try {
      line.open(audioFormat);
  } catch (LineUnavailableException e) {
      e.printStackTrace();
      return;
      // TODO Auto-generated catch block

  }
  // pour que le flux soit effectivement redirigé sur la carte son il
  // faut
  // demarrer la ligne
  line.start();

  // il faut maintenant écrire sur la ligne. Travail comme sur un
  // inputStream quelconque
  try {
      byte bytes[] = new byte[1024/8];
      int bytesRead=0;
      /*
      while (((bytesRead = audioInputStream.read(bytes, 0, bytes.length)) != -1)//les changements doivent être ici
      && !stop) {

   line.write(bytes, 0, bytesRead);
      }
      */
      while (((bytesRead = pipedIn.read(bytes, 0, bytes.length)) != -1)
      && !stop)
   line.write(bytes, 0, bytesRead);
  } catch (IOException io) {
      io.printStackTrace();
      return;
  }
  // on ferme la ligne à la fin
  line.close();

}

public void setFile(File file) {
  this.file = file;

}

public void setPipedInputStream(PipedInput​Stream pipedIn) {
  this.pipedIn = pipedIn;

}

public SourceDataLine getLine() {
  return line;

}


 }
 



 



import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
 import java.io.IOException;
 import java.io.PipedOutputStream;
 import java.io.File;

 import javax.sound.sampled.AudioFileF​ormat;
 import javax.sound.sampled.AudioForma​t;
 import javax.sound.sampled.AudioInput​Stream;
 import javax.sound.sampled.AudioSyste​m;
 import javax.sound.sampled.DataLine;
 import javax.sound.sampled.LineUnavai​lableException;
 import javax.sound.sampled.TargetData​Line;


 public class AudioRecorder implements Runnable {

private TargetDataLine line;

private AudioFormat audioFormat;

private static final AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE;

private PipedOutputStream pipedOut = null;

boolean stopped = false;

public void init() {
  if (pipedOut == null)
      return;

  audioFormat = new AudioFormat(8000, 8, 1, true, true);

  // En plus du format du flux audio d'entrée il est nécessaire de
  // spécifier le type de DataLine qu'on veut
  // ici le DataLine qu'on souhaite est un SourceDataLine qui permet
  // la
  // lecture (targetDataLine permet l'enregistrement).

  //la ligne d'aprés va tester si le format de l'audio introduite est acceptable ou non:
  DataLine.Info info = new DataLine.Info(TargetDataLine.c​lass,audioFormat);

  if (!AudioSystem.isLineSupported(​info))
      {
   System.err.println("Audio Format specified is not supported" );
   return;
      }
   
  // On récupère le DataLine adéquat
  try {
      line = (TargetDataLine) AudioSystem.getLine(info);
     
  } catch (LineUnavailableException e) {
      e.printStackTrace();
      return;
  }

}

public void run() {

  // on ouvre le Dataline
  try {
      line.open(audioFormat);
      //line.open(audioFormat, line.getBufferSize());
  } catch (LineUnavailableException e1) {
      e1.printStackTrace();
      return;
  }

  // pour que le flux soit effectivement redirigé sur la carte son il
  // faut
  // demarrer la ligne
  line.start();
  AudioInputStream audioInputStream = new AudioInputStream(line);

  try {
      //AudioSystem.write(audioInput​Stream, targetType, verBaffle);
      //AudioSystem.write(audioInput​Stream, targetType, fichier);
      int numBytesRead;
      byte[] data = new byte[line.getBufferSize() / 5];
      while (!stopped) {
   if ((numBytesRead = line.read(data, 0, data.length)) == -1)
       break;
   pipedOut.write(data, 0, numBytesRead);
      }
      System.out.println("stopping the capture from targetDataLine" );
      pipedOut.flush();
  } catch (IOException e1) {
      e1.printStackTrace();
  } finally {
      line.close();
      try {
   audioInputStream.close();
      } catch (IOException e) {
   e.printStackTrace();
      }

  }

  line.stop();
  line.close();

}

public TargetDataLine getLine() {
  return line;

}

public void setPipedOutputStream(PipedOutp​utStream pipedOut) {
  this.pipedOut = pipedOut;

}

public void stopCapture() {
  System.out.println("stopCaptur​e() called" );
  stopped = true;

}

 }
 



 



/*____________________________​______________________________​__________
  Ce denier class est le principale, et avant l'éxecution tu doit lui importer 4 images: load.png, play.png, record.png, stop.png, sinon les boutons seron vides
  --------------------*/

 import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.event.ActionEvent;
 import java.io.File;
 import java.io.IOException;
 import java.io.PipedInputStream;
 import java.io.PipedOutputStream;

 import javax.sound.sampled.LineEvent;
 import javax.sound.sampled.LineListen​er;
 import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.ImageIcon;
 import javax.swing.JFileChooser;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JToolBar;
 import javax.swing.filechooser.FileFi​lter;


 public class AudioRecorderPlayerGUI {

private Thread audioPlayerThread;

private AudioPlayer player;

private Thread audioRecorderThread;

private AudioRecorder recorder;

private Action load;

private Action play;

private Action stop;

private Action record;

private JFrame frame;

private JPanel contentPane;

private JFileChooser chooser;

private File audioPlayFile;

private File audioRecordFile;

private JLabel playTitle;

private JLabel recordTitle;

private PipedInputStream pipedIn;

private PipedOutputStream pipedOut;

public AudioRecorderPlayerGUI(){


  player=new AudioPlayer();
  recorder=new AudioRecorder();

  frame = new JFrame("AudioRecorder+Player" )​;
  contentPane = new JPanel(new BorderLayout());
  chooser = new JFileChooser();
  chooser.setFileFilter(new FileFilter() {
   // @Override
   public boolean accept(File f) {
       if (f.getName().endsWith(".wav" ) || f.isDirectory())
    return true;
       else
    return false;
   }

   //@Override
   public String getDescription() {
       return null;
   }
      });

  contentPane.setPreferredSize(n​ew Dimension(300, 150));

  stop = new AbstractAction() {

   public void actionPerformed(ActionEvent arg0) {

       if(player!=null) player.stop();
       //if(recorder!=null) recorder.getLine().stop();
       if ((recorder != null) && (recorder.getLine() != null)) {
    recorder.stopCapture();
    recorder.getLine().stop();
       }
       play.setEnabled(true);
       record.setEnabled(true);
       stop.setEnabled(false);
   }
      };
  stop.putValue(Action.SMALL_ICO​N, new ImageIcon("stop.png" ));


  play= new AbstractAction() {

   public void actionPerformed(ActionEvent arg0) {

       //player.setFile(audioPlayFile​);
       player.init();

       audioPlayerThread = new Thread(player);
       audioPlayerThread.start();
       player.getLine().addLineListen​er(new LineListener(){

        public void update(LineEvent le) {
     if(le.getType()==LineEvent.Typ​e.STOP || le.getType()==LineEvent.Type.C​LOSE){
         play.setEnabled(true);
         record.setEnabled(true);
         stop.setEnabled(false);

     }
     if(le.getType()==LineEvent.Typ​e.START){
         play.setEnabled(false);
         record.setEnabled(false);
         stop.setEnabled(true);
     }
        }
    });

   }
      };

  play.putValue(Action.SMALL_ICO​N, new ImageIcon("play.png" ));

  load = new AbstractAction() {
   public void actionPerformed(ActionEvent arg0) {
       int returnVal = chooser.showOpenDialog(frame);
       if (returnVal == JFileChooser.APPROVE_OPTION) {

    audioPlayFile=chooser.getSelec​tedFile();
    player.setFile(audioPlayFile);
    player.init();
    playTitle.setText("Fichier en liste de lecture: "+ audioPlayFile.getName());
    contentPane.paintAll(contentPa​ne.getGraphics());

       }
   }
      };
  load.putValue(Action.SMALL_ICO​N, new ImageIcon("load.png" ));


  record=new AbstractAction(){

   public void actionPerformed(ActionEvent arg0) {

       if (true) {
    /*
      record.setEnabled(false);
      String recordFileName = "record.wav";
      File recordFile = new File(recordFileName);
      if (!recordFile.exists())
      try {
      if (!recordFile.createNewFile()) {
      record.setEnabled(true);
      return;
      }
      }
      catch (IOException exn) {
      exn.printStackTrace();
      return;
      }
     
      recorder.setFile(recordFile);
    */
    try {
        pipedIn = new PipedInputStream();
        pipedOut = new PipedOutputStream(pipedIn);
        //pipedIn.connect(pipedOut);
     
        player.setPipedInputStream(pip​edIn);
        recorder.setPipedOutputStream(​pipedOut);

        recorder.init();
        player.init();
     
        audioRecorderThread = new Thread(recorder);
        audioPlayerThread = new Thread(player);
        audioPlayerThread.start();
        audioRecorderThread.start();
        //record.setEnabled(false);
    }
    catch (Exception exn) {
        exn.printStackTrace();
    }
       }else return;

   }

      };

  record.putValue(Action.SMALL_I​CON, new ImageIcon("record.png" ));

  JToolBar toolbar = new JToolBar();
  toolbar.add(load);
  toolbar.add(play);
  toolbar.add(stop);
  toolbar.add(record);

  playTitle=new JLabel("Lecture: Aucun fichier chargé" );
  recordTitle=new JLabel("Enregistrement: Aucun fichier chargé" );
  contentPane.add(toolbar, BorderLayout.NORTH);
  contentPane.add(playTitle,Bord​erLayout.CENTER);
  contentPane.add(recordTitle,Bo​rderLayout.SOUTH);
  frame.setContentPane(contentPa​ne);
  frame.setDefaultCloseOperation​(JFrame.EXIT_ON_CLOSE);
  frame.pack();
  frame.setVisible(true);

}

/**

* @param args

*/

public static void main(String[] args) {
  new AudioRecorderPlayerGUI();

}

 }
 




 Le principe est que la classe principale créée un PipedInputStream et un PipedOutputStream, les connecte entre eux, et passe le PipedInputStream au player et le PipedOutputStream au recorder. Le recorder enregistre ce qui arrive du microphone et le stocke dans le PipedOutputStream. Le tube PipedOutputStream/PipedInputSt​ream fait que le player lit depuis son PipedInputStream ce que le recorder a stocké et le diffuse sur les hauts-parleurs.
 Donc quand tu lances l'application, clique sur le bouton recorder et tu pourras directement écouter sur les enceintes ce qui vient du microphone, sans rien stocker sur le disque dur.
 Attention : je n'ai fait que connecter entre eux deux streams via un tube. Je n'ai rien modifié d'autre. il faut donc que tu regardes comment arrêter proprement tes threads et fermer les streams proprement (à priori, ce sera l'interface principale qui fermera les PipedInputStream et PipedOutputStream, et non les threads qu'elle démarre).

 @+

babanjida
Présent de temps en temps (De 50 à 99 messages postés)
  1. Posté le 08/12/2006 à 17:03:17  
  1. answer
  1. Prévenir les modérateurs en cas d'abus
 
J'ai éxécuté votre code, mais il y a un décalage trés enorme entre l'instant de parler et l'instant d'entendre la parole.
 Désolé, mais ça ne me réalise pas le but.
 Pouvez vous m'aidez encore?

(Publicité)
minus-et-cortex
Débutant confirmé (de 1 000 à 4 999 messages postés)
  1. Posté le 08/12/2006 à 18:03:55  
  1. answer
  1. Prévenir les modérateurs en cas d'abus
 
Salut!
 



Je cherche à construire un programme qui me permet de lire le son à partir de la carte son, puis le reenvoyer directement à la carte son: comme le fonctionnement du haut parleur.

 alors ce programme ne doit pas enregistrer sur le disque dire.



 Je pensais que d'après ton premier message, ce programme faisait ce que tu souhaitais. S'il faut qu'il en fasse plus, comme ne pas avoir de latence, je dois dire que je ne sais pas comment faire. Peut-être en jouant sur la taille des buffers pour lire/écrire sur les lignes (target et source).
 Désolé de ne pouvoir en faire plus.

 @+

babanjida
Présent de temps en temps (De 50 à 99 messages postés)
  1. Posté le 09/12/2006 à 19:48:04  
  1. answer
  1. Prévenir les modérateurs en cas d'abus
 
Mérci pour tous vos aides

 Page :
1

Aller à :
 

Sujets relatifs
traitement formulaire php [OS][JAVA][LGPL]JNode 0.2 est arrivé!
Logiciel traitement vidéo Traitement photo
Traitement d'image traitement des cartes bancaires
Plus de sujets relatifs à : traitement du son sous java

Les 5 sujets de discussion précédents Nombre de réponses Dernier message
Comment créer un quizz ? 4
probleme résolution 1
problème insertion bannière swf 3
comment fair ca... svp 14
sitemap 2