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 :

Flux sortie d'une application


Sujet :

Java

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 109
    Points : 52
    Points
    52
    Par défaut Flux sortie d'une application
    Bonjour,
    En lançant la commande "ffmpeg -i video.avi" dans une fenêtre DOS,la console m'affiche maintes informations sur la vidéo.Ma question est comment récupérer ces messages à l'aide d'un programme java. J'ai essayé avec le flux de sortie de ffmpeg mais ça n'a rien affiché. Le code que j'utilise est le suivant :
    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
     
      public static void main (String args[])
           {
        	   Runtime runtime = Runtime
    					.getRuntime();
        		try {
    				final Process process = runtime.exec("ffmpeg.exe -i ski.avi");
    				new Thread() {
    					public void run() {
    						try {
    							BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    							String line = "";
    							try {
    								while((line = reader.readLine()) != null) {
    									// Traitement du flux de sortie de l'application si besoin est
    									System.out.println(line);
    								}
    							} finally {
    								reader.close();
    							}
    						} catch(IOException ioe) {
    							ioe.printStackTrace();
    						}
    					}
    				}.start();
    			} catch (IOException e3) {
    				// TODO Auto-generated catch block
    				e3.printStackTrace();
    			}
     
           }
    Merci

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    Le flux de sortie c'est getOutputStream pas getInputStream. Enfin c'est la confusion que me suggère ton code là.

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 109
    Points : 52
    Points
    52
    Par défaut
    Merci, mais je ne suis pas d'accord , le flux de sortie est récupérable grâce à getInputStream(). http://ydisanto.developpez.com/tutor.../runtime-exec/

  4. #4
    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
    Salut,


    @Robin56 : Non c'est bien getInputStream() qui renvoi un InputStream correspondant au stdout du process...


    @louzorios : il faut traiter les autres flux. ffmpeg.exe pourrait être bloqué en attente sur son stdin, ou écrire sur son stderr.
    Perso je te conseille de les fermer si tu ne les utilises pas, et d'utiliser ProcessBuilder qui te permet de joindre le stdout et le stderr en un seul et unique flux :

    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
    	public static void main(String args[]) {
    		new Thread() {
    			public void run() {
    				try {
    					final Process process = new ProcessBuilder("ffmpeg.exe", "-i", "ski.avi")
    						.redirectErrorStream(true).start();
     
    					process.getErrorStream().close();
    					process.getOutputStream().close();
     
    					BufferedReader reader = new BufferedReader(
    							new InputStreamReader(process.getInputStream()));
    					String line = "";
    					try {
    						while ((line = reader.readLine()) != null) {
    							// Traitement du flux de sortie de l'application
    							// si besoin est
    							System.out.println(line);
    						}
    					} finally {
    						reader.close();
    					}
    				} catch (IOException ioe) {
    					ioe.printStackTrace();
    				}
    			}
    		}.start();
    	}
    a++

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 109
    Points : 52
    Points
    52
    Par défaut
    Je vous remercie, ça marche

  6. #6
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    @Robin56 : Non c'est bien getInputStream() qui renvoi un InputStream correspondant au stdout du process...
    Ah bah au temps pour moi, j'aurais appris quelque chose.

    Et cette remarque sur le tutoriel mis en lien par louzorios m'éclaircit mieux la chose :
    Citation Envoyé par ydisanto
    Remarque : au premier abord il peut paraître étrange de récupérer un InputStream pour le flux de sortie standard. Cependant il faut bien se placer au niveau de l'application Java.
    En effet, il s'agit de la sortie standard de l'application externe, l'application Java va lire ce flux qui est donc de son point de vue (en fait le notre) un flux d'entrée (idem pour le flux d'erreur). De même pour l'entrée standard de l'application externe, du point de vue de l'application Java il s'agit d'un flux de sortie puisqu'elle y écrit (d'où le OutputStream).

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

Discussions similaires

  1. Capture de la sortie d'une application console
    Par Nono40 dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 23/02/2013, 11h51
  2. Ecrire l'heure système à la sortie d'une application
    Par marc-antoine dans le forum VBScript
    Réponses: 5
    Dernier message: 21/11/2008, 10h47
  3. Réponses: 3
    Dernier message: 02/06/2008, 16h13
  4. Sortie d'une application dès
    Par Depteam1 dans le forum MFC
    Réponses: 4
    Dernier message: 13/09/2005, 13h16

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