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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
package classes;
import interfaces.Ecouteur;
import interfaces.EcouteurEncodage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ecouteurMEncoder extends Thread implements Ecouteur {
final ArrayList<EcouteurEncodage> ecouteurs = new ArrayList();
final String chemin;
final int DEBUT = 1;
final int FIN = 2;
final int ERREUR = 3;
private volatile Thread moniteur;
public ecouteurMEncoder(String chemin) {
// Ici, le chemin correspond au chemin pleinnement qualifié d'accès au dossier contenant les images, et mencoder.exe
this.chemin = chemin;
setDaemon(true);
}
@Override
public void start() {
moniteur = new Thread(this);
moniteur.start();
}
public boolean arret() {
boolean reponse;
moniteur = null;
reponse = (moniteur == null);
return reponse;
}
@Override
@SuppressWarnings("SleepWhileInLoop")
public void run() {
envoiMessage("Thread ecouteur d'encodage démarré...", DEBUT);
String[] commande = {chemin + File.separator + "mencoder.bat", "1024", "768", "25", "mpeg4", "testAvecRuntime.avi"};
//String[] commande = {chemin + File.separator + "mencoder_rev2.bat", "1024", "768", "25", "mpeg4", "testAvecRuntime.avi"};
Process mencoder;
BufferedReader sortieConsole;
try {
// Il n'y a pas à ajouter de directives environnementales, d'où le null
mencoder = Runtime.getRuntime().exec(commande, null, new File(chemin));
// Récupération du flux de verbosité de mon shell natif dans lequel s'exécute "commande"
sortieConsole = new BufferedReader(new InputStreamReader(mencoder.getInputStream()));
// Instanciation et initialisation de mon Thread d'écoute de flux
recupMessages recuperateur = new recupMessages(sortieConsole);
// Ajout de l'écoute d'informations issues de recuperateur
recuperateur.ajouteEcouteur(this);
// Attente de la fin du processus externe...
mencoder.waitFor();
}
catch (IOException | InterruptedException ex) {
Logger.getLogger(ecouteurMEncoder.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void ajouteEcouteur(EcouteurEncodage ecouteur) {
if (!ecouteurs.contains(ecouteur)) ecouteurs.add(ecouteur);
}
public void retireEcouteur(EcouteurEncodage ecouteur) {
if (ecouteurs.contains(ecouteur)) ecouteurs.remove(ecouteur);
}
private void envoiMessage(String msg, int type) {
switch (type) {
case DEBUT:
ecouteurs.stream().forEach((ect) -> {
ect.debutEncodage(msg);
});
break;
case FIN:
ecouteurs.stream().forEach((ect) -> {
ect.finEncodage(msg);
});
break;
case ERREUR:
ecouteurs.stream().forEach((ect) -> {
ect.erreurEncodage(msg);
});
break;
}
}
@Override
public void declenchement(String message) {
envoiMessage(message, DEBUT);
}
} |
Partager