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 :

lectture audio accélérée


Sujet :

Multimédia Java

  1. #1
    SGJ
    SGJ est déconnecté
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 59
    Par défaut lectture audio accélérée
    Bonjour,

    J'ai un code qui lit un fichier audio .wav et le rejoue. Ca marche très bien. Je souhaite pouvoir le rejouer en accéléré, c'est toujours amusant pour les enfants. J'utilise Java sound, je n'ai pas trouvé comme le faire. Peut être quelqu'un a une idée ?

    Le code qui rejoue mon audio est
    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
     
     
     
    	        int frameSizeInBytes = currentFormat.getFrameSize();
    	        int bufferLengthInFrames = line.getBufferSize() / 8;
    	        int bufferLengthInBytes = bufferLengthInFrames * frameSizeInBytes;
    	        byte[] data = new byte[bufferLengthInBytes];
    	        int numBytesRead = 0;
    	        // start the source data line
    	        line.start();
    	        while (thread != null) {
    	            try {
     
    		            if ((numBytesRead = currentAudio.read(data,0,bufferLengthInBytes)) == -1) {
    	                	break;
    	                }
    	                int numBytesRemaining = numBytesRead;
    	                while (numBytesRemaining > 0 ) {
    	                    numBytesRemaining -= line.write(data, 0, numBytesRemaining);
    	                }
    	            } catch (Exception e) {
    	                shutDown("Error during playback: " + e);
    	                break;
    	            }
    	        }
    Je ne vois pas comment changer ce code pour qu'il lise en accéléré.
    Merci d'avance

  2. #2
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    J'ai vu ça sur la doc SUN : http://java.sun.com/j2se/1.4.2/docs/...ml#SAMPLE_RATE

    Du coup, regarde du côté de : http://www-igm.univ-mlv.fr/~dr/XPOSE...rcontrols.html

    Les sources sont libres, compile le programme, teste le, et dis moi si ca répond à ta question...

    J'ai pas de carte son au bureau, et je suis intéressé par le résultat.


    Billy

  3. #3
    SGJ
    SGJ est déconnecté
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 59
    Par défaut
    Merci, je vais essayer et je te tiendrai au courant.

  4. #4
    SGJ
    SGJ est déconnecté
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 59
    Par défaut
    Salut,

    Désolé que je ne suis pas revenu vers toi plus tôt, je viens de recommencer à travailler sur mon application.

    J'ai téléchargé le code sur le site que tu m'a indiqué et j'ai trouvé que c'est bien ça, la classe FloatControl permet de faire de la lecture accéléré. Il sufft de réceupérer le control et de l'utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (line.isControlSupported(FloatControl.Type.SAMPLE_RATE)) {
          m_sampleRateControl = (FloatControl) line
                        .getControl(FloatControl.Type.SAMPLE_RATE);
    }
    Mon problème maintenant est que le test "isControlSupported" est négatif pour certains audio que j'utilise, pourtant ils sont tous des .wav.

    Est ce que tu as une idée pourquoi un audio supporterait le control et un autre non ?

    Merci

  5. #5
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    J'ai eu la même difficulté. Tu as oublié les précieuses lignes du choix du mixer. En effet, il ne faut pas prendre celui par défaut...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	        /** Recherche du mixer logiciel Java Sound Audio Engine */
    	        for (Mixer.Info mixerInfo : AudioSystem.getMixerInfo()) {
    	            if (mixerInfo.getName().compareTo("Java Sound Audio Engine") == 0) {
    	                mixer = AudioSystem.getMixer(mixerInfo);
    	                break;
    	            }
    	        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sourceDataLine = (SourceDataLine) mixer.getLine(dataLineInfo);
    Je pense qu'avec ces petits bouts de code, tu t'en sortiras! D'ailleurs, je me suis amusé à testé tous les controles (le mute, le pan, etc...).

    Cordialement

  6. #6
    SGJ
    SGJ est déconnecté
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 59
    Par défaut
    Merci beaucoup pour ton aide.

  7. #7
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    En espérant que les enfants apprécieront tes efforts.

    Cordialement,


    Billy

  8. #8
    SGJ
    SGJ est déconnecté
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 59
    Par défaut
    Salut,

    Je reviens vers vous (et surtout vers toi billynirvana) parce que j'ai encore une petite question. Mon programme qui capture un sound, le rejoue et permet de changer le rate pour le jouer en accéleré (ce qui fait rire les enfants) marche bien. Ce qui ne me plaît pas est que je fais les appels suivants pour initialiser mon JSlider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    rateSlider= new JSlider((int) animPan.animation.m_sampleRateControl.getMinimum(), 
    		(int) animPan.animation.m_sampleRateControl.getMaximum());
    rateSlider.setValue((int) animPan.animation.m_sampleRateControl.getValue());
    Pour un sound donné, j'ai par exemple obtenu :
    minimum = 0
    maximum = 48000
    value = 44100

    Je peux rendre le son très lent puisque j'ai une marge de 0 à 44100, mais la marge pour accelerer le son est seulement de 44100 à 48000. Même si je le mets à 48000 qui est le maximum, on sent à peine que le son est accéléré.

    J'ai essayé avec plusieurs sons capturés et j'ai toujours la "value" très proche du maximum ce qui fait que le son n'est pas sufisemment accéléré et ne fait donc pas rire suffisemmentles enfants.

    Quelqu'un aurait une idée comment obtenir une value loin du maximum (15000 par exemple) sachant que j'utilise le format .WAV ? Je n'ai aucune idée de quoi dépendent ces min, max et value.

    Merci

  9. #9
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Salut,

    C'est peut être pas convenable de penser cela, mais si tu encodes tes fichiers audios en 22100Khz (donc perte de qualité), et que le min et le max gardent les mêmes valeurs (0 et 48000), je pense que tu auras une marge à peu près égale pour décélerer et accélerer la lecture audio.

    Peux-tu me faire un retour sur cette hypothèse?


    Bon courage.

    Merci.

  10. #10
    SGJ
    SGJ est déconnecté
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 59
    Par défaut
    Merci pour ta réponse.
    Cette hypotèse est tout à fait vraie, je l'ai essayé et elle fonctionne bien. Mais nous avons résolu le problème en diminuant la fréquence (donc perte de qualité), j'essayais de trouver un moyen pour augmenter le maximu et garder l'encodage à 44khz.

    Dans le code qui crée le format de l'audio ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    audFormat = new AudioFormat(encoding,rate,sampleSizeInBits,channels,(sampleSizeInBits/8)*channels,rate,bigEndian);
    changer l'encodage revient à changer le rate. Mais Je ne vois pas du tout comment changer le maximum et comment celui ci est calculé.

    Merci

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 100
    Par défaut
    bonjour
    je suis en traind de faire un client SIP.
    l'idee est la meme que pour lire un fichier audio.
    avec des "mixer" pour choisir la carte son et des "sourceDataLine" pour s'abonner au son sur la carte son.

    Ce que je voudrais faire c'est mettre deux sourceDataLine dans un mixer pour avoir deux conversation en meme temp sur une carte son ...

    jusqu'a maintenant mes efforts sont vains ...

    Auriez vous une idee ?

    merci

  12. #12
    SGJ
    SGJ est déconnecté
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 59
    Par défaut
    J'aurai bien aimé t'aider, mais ce n'est vraiment pas mon domaine.

  13. #13
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Citation Envoyé par maverick56 Voir le message
    bonjour
    je suis en traind de faire un client SIP.
    l'idee est la meme que pour lire un fichier audio.
    avec des "mixer" pour choisir la carte son et des "sourceDataLine" pour s'abonner au son sur la carte son.

    Ce que je voudrais faire c'est mettre deux sourceDataLine dans un mixer pour avoir deux conversation en meme temp sur une carte son ...

    jusqu'a maintenant mes efforts sont vains ...

    Auriez vous une idee ?

    merci
    Pour maverick56: Détaille un peu ce que tu veux et montre un peu ton code si tu pveux que je t'aide.

    J'ai essayé de regarder un peu pour le problème de SGJ, mais j'ai à l'heure actuelle aucune autre solution à part de modifier le framerate dans le fichier audio lui même.

  14. #14
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 100
    Par défaut
    oui désolé billynirvana
    J'ai créer une autre discution avec mon probleme ("Plusieurs client sip sur un meme poste en JAVA") pour que ca soit plus propre ...
    la voici : http://www.developpez.net/forums/sho...23#post2815023

    merci

  15. #15
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Je me suis amusé à modifier des petits trucs pour décélerer et accélérer les clips audios, j'ai remarqué qu'on pouvait faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    AudioInputStream ais = AudioSystem.getAudioInputStream(file);
    format = ais.getFormat();
    System.out.println(format.getEncoding());
    System.out.println(format.getSampleRate());
    System.out.println(format.getSampleSizeInBits());
    System.out.println(format.getChannels());
    System.out.println(format.getFrameSize());
    System.out.println(format.getFrameRate());
    System.out.println(format.isBigEndian());
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    format = new AudioFormat(format.setEncoding(), 22050.0F, format.setSampleSizeInBits(), format.setChannels(), format.setFrameSize(), 96000.0F, format.isBigEndian());
    line.open(format);
    Voilà, mes sons arrivent encore à être joués avec une amplitude plus élevée pour l'accéleration. Je t'encourage à récupérer ce bout de code et de l'exploiter. En espérant que cela puisse t'aider!


    Billy

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/10/2010, 09h16
  2. Lire les pistes d'un cd audio qd il y a plusieur lecteurs cd
    Par busy999 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/10/2003, 09h26
  3. extraire une portion audio d'une vidéo
    Par Brunoo dans le forum DirectX
    Réponses: 2
    Dernier message: 16/06/2003, 10h29
  4. cherche module ou langage pour récupérer des données audio..
    Par Ry_Yo dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 12/05/2003, 17h44
  5. programmation audio !?
    Par martimacfly dans le forum DirectX
    Réponses: 1
    Dernier message: 09/03/2003, 12h55

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