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

API standards et tierces Java Discussion :

Comment utiliser ProcessBuilder sous OS X


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut Comment utiliser ProcessBuilder sous OS X
    Bonjour,

    J'essaie d'intégrer la lecture de videos à un programme en utilisant le logiciel VLC (j'ai essayé avec d'autres "Video players" avec le même résultat).
    Le code suivant marche très bien sous Windows ,
    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
     
    public class Test  
    {
    public Test()
    {	
    	try 
            {
                 String myargs = "\"F:\\Cinephil\\Videos\\mavideo.mov\"" ;
    	     Process p = new ProcessBuilder("E:/vlc/VLC.exe", myargs, "vlc://quit").start();
    	     p.waitFor();
    	}
            catch (Exception ex){System.out.println(ex.toString();} 	
    }
     
    public static void main( String[] args )
    {   new Test();
    }
    }
    Toutefois lorsque je l'adapte sous OS X je ne suis pas arrivé à ouvrir le fichier VIdeo. Évidemment j'ai fait tout un tas d'essais par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Process p = new ProcessBuilder("open", " - a", "VLC").start() ;
    Ici je suis capable d'ouvrir VLC et de sélectionner le fichier à ouvrir.

    Mais je n'arrive pas à passer les paramètres avec la commande. Rien ne se passe. Je définis le fichier video comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String args = "\"/Volumes/cd Applications/Users/gerardmartinelli/Cinephil/Videos/mavideo.mov\"";
    Le path me parait correct car si je tape
    ls -l "/Volumes/cd Applications/Users/gerardmartinelli/Cinephil/Videos"
    je vois bien la liste de mes videos.

    J'ai donc essayé le choses suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process p = new ProcessBuilder(("open" , "- a", "VLC", args).start();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Process p = new ProcessBuilder(("open" , "- a", "VLC", "\"args\"").start() ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Process p = new ProcessBuilder(("open" , "- a", "VLC  \"" + args + "\"").start() ;
    mais rien ne se passe.

    J'ai aussi essayé la chose suivante,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Process p = new ProcessBuilder("/Volumes/cd Applications/Applications/VLC.app", args).start()  ;
    Mais dans ce cas j'ai le message"Permission denied", même si auparavant j'ai passé la commande chmod u+x VLC.app

    Sans doute ai-je des messages d'erreur mais rien ne s'affiche (je développe sous Eclipse). Si oui, y-a-il un moyen de les diriger vers un fichier ?

    Je suis conscient que c'est plus lié à l'environnement OS X qu'à purement Java mais si quelqu'un avait cette expérience j'apprécierais grandement


    Merci d'avance.

    Gégé

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il ne faut pas reporter les double-quotes dans ProcessBuilder.
    Les double-quotes sont une syntaxe du shell pour délimité les paramètres, or ils sont déjà délimité dans ProcessBuilder.



    Quel est la commande que tu tapes dans l'invite de commande ?


    a++

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    Merci Adiguba pour cette réponse rapide.

    Pour ma commande en mode terminal, je tape :

    open -a VLC.app "/Volumes/cd Applications/Users/gerardmartinelli/Cinephil/Videos/mavideo.mov", vlc://quit

    ce qui fonctionne parfaitement.

    Je souhaiterais donc passer cette commande via ProcessBuilder. Les double quotes sont nécessaires ici à cause du path qui contient un espace.

    Ce qui me semble ambigüe c'est est-ce que "/Volumes/cd Applications/Users/gerardmartinelli/Cinephil/Videos/mavideo.mov" est-il considéré comme un paramètre de "open" ou de VLC ?

    Merci encore

    Gégé

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    En modifiant légèrement mon code pour rediriger les messages , j'ai pu comprendre le problème :
    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
     
     public class Test  
    {
    public Test()
    {	
       try 
       {
            String myargs = "/Volumes/cd Applications/Users/gerardmartinelli/Cinephil/Videos/mavideo.mov";
            ProcessBuilder pb = new ProcessBuilder("open", "-a", "VLC", myargs );
            pb.redirectErrorStream(true);
    	Process p = pb.start();
          	String s;
           // read from the process's combined stdout & stderr
            BufferedReader stdout = new BufferedReader(new InputStreamReader(p.getInputStream()));
           while ((s = stdout.readLine()) != null) 
           {
              System.out.println(s);
           }
    	p.waitFor();
       } 
      catch (Exception ex){System.out.println("erreur de process :" + ex.toString());} 		
    }
     
      public static void main( String[] args ) {   new Test();}
    }
    En fait le chemin vers le fichier que je voulais absolu est concaténé avec le dossier où se trouve ma classe Test dans Eclipse.
    /Users/gerardmartinelli/Documents/Workspace/TEST/


    Si bien que le fichier est recherché dans
    /Users/gerardmartinelli/Documents/Worskpace/TEST/Volumes/cd Applications/Users/gerardmartinelli/Cinephil/Videos/mavideo.mov

    Ce qui est évidemment faux. Le même problème se posera en production si le répertoire des Videos n'est pas un sous dossier de celui ou se trouve cette classe (ou le Jar).

    Comment puis-je spécifier un chemin absolu en paramètre. Je dois ajouter que je débute en OS X et donc je ne suis pas très familier avec l'architecture de fichiers sur les Mac.

    Merci encore pour toute suggestion.

    Gégé

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par GérardMartinelli Voir le message
    Je souhaiterais donc passer cette commande via ProcessBuilder. Les double quotes sont nécessaires ici à cause du path qui contient un espace.
    Les double-quotes sont nécessaire pour le shell, mais l'application reçoit la chaine sans les quotes.
    Et ProcessBuilder n'est pas un shell : il faut lui passer les paramètres tel que le programme doit les recevoir.

    Citation Envoyé par GérardMartinelli Voir le message
    Ce qui me semble ambigüe c'est est-ce que "/Volumes/cd Applications/Users/gerardmartinelli/Cinephil/Videos/mavideo.mov" est-il considéré comme un paramètre de "open" ou de VLC ?
    Dans le cas présent c'est un paramètre de open, qui lui même doit le passer à VLC.
    D'ailleurs d'après la doc de open il faudrait les faire précéder de --args pour éviter les ambiguïtés : https://developer.apple.com/legacy/l...n1/open.1.html


    Bref pour moi la commande devrait être la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ProcessBuilder pb = new ProcessBuilder("open", "-a", "VLC.app", "--args", "/Volumes/cd Applications/Users/gerardmartinelli/Cinephil/Videos/mavideo.mov", "vlc://quit");


    Citation Envoyé par GérardMartinelli Voir le message
    En modifiant légèrement mon code pour rediriger les messages , j'ai pu comprendre le problème :
    Au passage depuis Java 7 tu peux te contenter d'utiliser pb.inheritIO() qui recopie automatiquement les flux dans la console.
    Plus pratique et plus simple...



    Citation Envoyé par GérardMartinelli Voir le message
    Comment puis-je spécifier un chemin absolu en paramètre. Je dois ajouter que je débute en OS X et donc je ne suis pas très familier avec l'architecture de fichiers sur les Mac.
    Je ne suis pas très familier non plus du monde Mac, mais cela ressemble bien à un chemin absolu donc je ne comprend pas trop.
    Quel sont les messages d'erreurs que tu obtiens ???


    a++

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    Effectivement en utilisant --args cela fonctionne correctement. J'ai encore quelques petits réglages à faire du côté de VLC ,mais j'ai fait, avec ton aide, un grand pas.
    La commande que je passe est exactement celle que tu m'as indiquée.

    Merci encore pour ton aide précieuse

    Gégé

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

Discussions similaires

  1. Comment utiliser le sous-forum Access : TOUS
    Par micniv dans le forum Sondages et Débats
    Réponses: 21
    Dernier message: 05/07/2007, 20h38
  2. comment utiliser apache2 sous ubuntu ?
    Par MortDansLAme dans le forum Administration système
    Réponses: 2
    Dernier message: 06/06/2007, 14h08
  3. Comment utiliser GTK sous visual?
    Par ryu20 dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 08/05/2007, 04h06
  4. Réponses: 6
    Dernier message: 03/05/2007, 11h28
  5. Réponses: 12
    Dernier message: 05/03/2007, 10h36

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