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

Java Discussion :

exécuter un programme en ligne de commande


Sujet :

Java

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut exécuter un programme en ligne de commande
    Voilà je souhaite lancer un programme fonctionnant en ligne de commande (ffmpeg => encodeur vidéo) à partir d'un programme JAVA.

    J'utilise la classe Runtime mais je n'obtiens pas le résultat escompté.

    J'ai commencé par essayer de lancer bêtement le programme avec une ligne du genre : Process p = runtime.exec("c:/ffmpeg/ffmpeg.exe"); mais il ne se passe rien (ça compile, pas d'erreur à l'exécution et pas d'affichage).

    Ensuite je suis partie sur l'idée de lancer une autre commande dos à partir du programme java et d'exécuter ffmpeg ds cette nouvelle commande. J'utilise pour cela la commande dos start mais j'obtiens alors une erreur à l'exécution. Voici mon code et l'erreur obtenue.

    Pourtant la commande fonctionne très bien en ligne de commande mais ça génère une erreur dans mon programme JAVA. Je n'y comprend rien .

    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
     public class executer
    {
        public static void main(String[]args)
        {
            try
            {
                String[] cmd = {};
                Runtime runtime = Runtime.getRuntime();
                Process p = runtime.exec("start C:/ffmpeg/ffmpeg.exe");
                p.waitFor();
            }
            catch (Exception err)
            {
                err.printStackTrace();
            }
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     java.io.IOException: CreateProcess: start C:/ffmpeg/ffmpeg.exe error=2
            at java.lang.ProcessImpl.create(Native Method)
            at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
            at java.lang.ProcessImpl.start(ProcessImpl.java:30)
            at java.lang.ProcessBuilder.start(ProcessBuilder.java:451)
            at java.lang.Runtime.exec(Runtime.java:591)
            at java.lang.Runtime.exec(Runtime.java:429)
            at java.lang.Runtime.exec(Runtime.java:326)
            at executer.main(executer.java:12)
    PS: Je réussi à lancer par exemple eclipse à partir de mon programme JAVA mais cela ne fonctionne pas avec ffmpeg car c'est un programme qui fonctionne en ligne de commande.

    Si qqn pouvait me venir en aide ce serait pas de refus...

  2. #2
    Membre chevronné
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Points : 2 208
    Points
    2 208
    Par défaut
    As-tu essayé avec un chemin du style: c:\\ffmpeg\\ffmpeg.exe vu que tu es sous windows ?


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  3. #3
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Salut,

    Lancer la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process p = runtime.exec("start C:/ffmpeg/ffmpeg.exe");
    ne peut pas marcher car "start" est une commande du shell cmd.exe. Comme ffmpeg.exe marche en ligne de commande il faut que tu reccupère l'entrée et la sortie standard de ton processus( et ) sinon tu ne pourra pas interagir avec lui(Je pense que ton code marche mais si tu ne recuppère pas la sortie standard de ton processus tu ne t'en rend pas compte).

  4. #4
    Membre expert
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Points : 3 135
    Points
    3 135
    Par défaut
    Si tu veux que ffmeg se lance dan une fenètre DOS et non en bacground de ton appli JAVA utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Runtime.getRuntime().exec("cmd /c c:\\ffmpeg\\ffmpeg.exe");
    .

  5. #5
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    je comprend pas tout ce que tu veux dire Hydraland. Pourrais-tu être plus explicite. Moritan et afrika, j'ai essayé vos idées et je n'ai pas de meilleurs résultats.

    Pour en revenir au inputstream et outputstream, j'arrive à récupérer le résultat de l'exécution de ffmpeg.exe dans l'inputstream en passant par un bufferreader mais je vois pas en quoi cela pourrait m'être utile... Je suis un peu perdu avec le système des sorties et entrées standard. Pourrais-tu Hydraland développer ton idée pour un ignorant comme moi ?

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    getInputStream() te renvoit un InputStream qui contient tout le texte écrit par le programme dans la sortie standard (stdout). Cela correspond au texte affiché dans la console lorsque tu lances le programme normalement.
    getErrorStream() te renvoit un InputStream qui contient tout le texte écrit par le programme dans la sortie d'erreur (stderr). Ce texte est également affichée dans le console...
    getOutputStream() te renvoit un OutputStream qui te permet d'envoyer du texte au programme via l'entrée standard (stdin). Il s'agit du texte que tu tapes au clavier lors d'une exécution normale...


    Avec ca tu as tout ce que tu as besoin pour interagir avec les programmes que tu lances...

    Une remarque toutefois : il faut obligatoirement lire les flux getInputStream() etgetErrorStream() dans deux thread différents afin d'éviter les interblocages...

    a++

  7. #7
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci je vais me replonger sur mon code cet après-midi.

  8. #8
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    J'ai trouvé une solution alternative qui fonctionne. Par contre me demander pas pourquoi lol.

    import java.io.*;

    public class executer
    {
    public static void main(String[]args)
    {
    String cmd = "test.bat";
    try
    {
    Runtime runtime = Runtime.getRuntime();
    Process p = runtime.exec(cmd);
    //p.waitFor();

    }
    catch (Exception err)
    {
    err.printStackTrace();
    }
    }
    }

    En fait j'ai écrit ma commande (ffmpeg.exe -y -i bacinebank.avi -s 176x144 -r 15 -b 40 -acodec amr_nb -ab 4 -ar 8000 -ac 1 -vcodec mpeg4 test.3gp) dans un fichier appelé test.bat et j'ai retiré le waitFor qui empêchait le processus de se lancer parce qu'il attendait indéfiniment la fin du précédent.

    Lorsque j'exécute mon programme Java, ma commande se lance en arrière plan et ma vidéo se trouve bien encodée.

    Merci pour votre aide à tous.

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    suite au même problème de création de processus, j'en suis venu à tester la solution vraiment désespérée qui consistait à créer un fichier batch et à l'exécuter.

    En fait, pour gérer de manière correcte vos création de processus, utilisez le plus souvent java.lang.ProcessBuilder. Celà permet de passer correctement les argument passer à votre programme.

    Voici un exemple tiré de la documentation officielle de java 6.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
     Map<String, String> env = pb.environment();
     env.put("VAR1", "myValue");
     env.remove("OTHERVAR");
     env.put("VAR2", env.get("VAR1") + "suffix");
     pb.directory(new File("myDir"));
     Process p = pb.start();
    Voilou.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/10/2008, 10h39
  2. Réponses: 3
    Dernier message: 13/06/2007, 16h47
  3. Réponses: 2
    Dernier message: 06/06/2007, 09h51
  4. Exécution programme en ligne de commande
    Par heddicmi dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 25/10/2006, 12h00
  5. Programme style ligne de commande
    Par inddzen dans le forum C
    Réponses: 12
    Dernier message: 31/08/2006, 16h53

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