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

Langage Perl Discussion :

Filtré sortie stdout (partie 3) (mkfifo inside)


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut Filtré sortie stdout (partie 3) (mkfifo inside)
    Bonsoir a tous,

    Je reviens avec un "truc" un peu plus compliqué (enfin il me semble)
    Toujours a fond dans mon script d'encodage (mais ca avance )
    Bref, voilà ce que j'utilise dans le shell pour lancer l'encodage d'une piste audio en 5.1 :

    mkfifo audiodump.pcm
    faac -q 100 -I 5,6 -P -R 48000 -C 6 -X audiodump.pcm -o ENG.mp4 & mplayer -dvd-device /mnt/loop dvd://4 -aid 128 -vc null -vo null -ao pcm:nowaveheader -channels 6
    Note : tout ce qui est après "faac" est sur une seule ligne normalement

    Tout ca grace a un pipe (mkfifo)

    Maintenant, j'aimerai l'intégré a mon script perl ...
    Voilà ce que j'ai écrit :

    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
    #!/usr/bin/perl
     
    use IO::Pipe;
     
    print "       Transcodage en AAC-LC 5.1 en cours ...\n";
                   if ( -p audiodump.pcm ) {
                           unlink audiodump.pcm;
                           system("mkfifo audiodump.pcm");
                   }
                   else {
                   system("mkfifo audiodump.pcm");
                   }
                   $|++;
                   my $transcode_faac = new IO::Pipe();
                   $transcode_facc->reader("faac -q 100 -I 5,6 -P -R 48000 -C 6 -X audiodump.pcm -o test.mp4 & mplayer -dvd-device /mnt/loop dvd://4 -aid 128 -vc null -vo null -ao pcm:nowaveheader -channels 6");
                   {
                   local $/ = "\r";
                   while( defined( my $line = $transcode_faac->getline ) ) {
                   print $1 if $line =~ m/(\d+\r)$/;
                          }
                   }
    Mais ca foire complètement :

    jerome@Gentoo ~/test $ ./faac
    Transcodage en AAC-LC 5.1 en cours ...
    mkfifo: ne peut créer le fifo `audiodump': Le fichier existe.
    Can't call method "reader" on an undefined value at ./faac line 15.
    Alors, comment faire pour filtré stdout avec un pipe au milieu ?
    D'autres part, j'aimerai aussi savoir pourquoi le test sur le pipe "audiodump.pcm" ne passe pas (il devrait l'effacer et le recréer)

    Jjeje007

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    Bonsoir,

    Bon, j'ai a peu près réussi, j'avais fait une erreur de frappe et pour le test sur le pipe, j'ai rajouté des " " et ca marche
    Enfin, j'arrive toujours pas à filtrer la sortie
    Voilà mon script de test :

    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
    use IO::Pipe;
     
    print "       Transcodage en AAC-LC 5.1 en cours ...\n";
                   if (-p "audiodump.pcm") {
                           unlink "audiodump.pcm";
                           system("mkfifo audiodump.pcm");
                   }
                   else {
                   system("mkfifo audiodump.pcm");
                   }
                   $|++;
                   my $transcode_faac = new IO::Pipe();
                   $transcode_faac->reader("faac -q 100 -I 5,6 -P -R 48000 -C 6 -X audiodump.pcm -o test.mp4 & mplayer -dvd-device /mnt/loop dvd://4 -aid 128 -vc null -vo null -ao pcm:nowaveheader -channels 6 2>&1 > /dev/null");
                   {
                   local $/ = "\r";
                   while( defined( my $line = $transcode_faac->getline ) ) {
                   print $1 if $line =~ m/(^\d+\r)$/;
                          }
                   }
    Voilà ce qui s'affiche dans le shell :

    Transcodage en AAC-LC 5.1 en cours ...
    Freeware Advanced Audio Coder
    FAAC 1.25

    Remapping input channels: Center=5, LFE=6
    Quantization quality: 100
    Bandwidth: 16000 Hz
    Object type: Low Complexity(MPEG-4) + M/S
    Container format: MPEG-4 File Format (MP4)
    Encoding audiodump.pcm to test.mp4
    frame | elapsed | play/CPU
    300 | 0.6 | 11.31x
    Et j'aimerais garder seulement ca :

    frame | elapsed | play/CPU
    300 | 0.6 | 11.31x
    Jjeje007

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    Salut,

    Bon, avec ceci :

    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
    #!/usr/bin/perl
     
    use IO::Pipe;
     
    open(STDERR, ">error.log" ) or die "Impossible de rediriger STDERR vers le fichier de log : $!\n";
     
    print "       Transcodage en AAC-LC 5.1 en cours ...\n";
                   print " frame | elapsed | play/CPU\n";
                   if (-p "audiodump.pcm") {
                           unlink "audiodump.pcm";
                           system("mkfifo audiodump.pcm");
                   }
                   else {
                   system("mkfifo audiodump.pcm");
                   }
                   $|++;
                   my $transcode_faac = new IO::Pipe();
                   $transcode_faac->reader("faac -q 100 -I 5,6 -P -R 48000 -C 6 -X audiodump.pcm -o test.mp4 & mplayer -dvd-device /mnt/loop dvd://4 -aid 128 -vc null -vo null -ao pcm:nowaveheader -channels 6");
                   {
                   local $/ = "\r";
                   while( defined( my $line = $transcode_faac->getline ) ) {
                   sleep 2;
                   print $1 if $line =~ m/^\s*$/;
                          }
                   }
    Je n'ai plus aucun affichage dans le shell :

    jerome@Gentoo ~/test $ ./test2
    Transcodage en AAC-LC 5.1 en cours ...
    frame | elapsed | play/CPU
    Et, ca :

    83 | 0.1 | 17.58x
    Ce retrouve dans mon "error.log" :

    Freeware Advanced Audio Coder
    FAAC 1.25

    libdvdread: Attempting to use device
    Using SSE optimized IMDCT transform
    Using MMX optimized resampler
    Remapping input channels: Center=5, LFE=6
    Quantization quality: 100
    Bandwidth: 16000 Hz
    Object type: Low Complexity(MPEG-4) + M/S
    Container format: MPEG-4 File Format (MP4)
    Encoding audiodump.pcm to test.mp4
    frame | elapsed | play/CPU

    83 | 0.1 | 17.58x
    84 | 0.1 | 17.40x
    100 | 0.1 | 15.23x
    150 | 0.2 | 13.04x
    200 | 0.3 | 12.21x

    MPlayer interrompu par le signal 2 dans le module : sleep_timer
    (J'ai fait un ctrl+c, pour arréter)

    S'il vous plait, aidez moi

    Jjeje007

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    Bonsoir a tous,

    J'ai résolu mon problème
    Il se trouve que le programme faac print ces infos en utilisant STDERR, alors j'ai du faire une redirection vers STDOUT, voilà ce que ca donne :

    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
    print "       Encodage en cours (Allez boire un café, c'est long :p) ...\n";
    														print "       frame | elapsed | play/CPU\n";
    															if (-p "audiodump.pcm") {
    																unlink "audiodump.pcm";
    																system("mkfifo audiodump.pcm");
    															}
    															else {
    																system("mkfifo audiodump.pcm");
    															}
    														$|++;
    														my $encodage_audio = new IO::Pipe();
    														$encodage_audio->reader("faac -q $q_audio -I 5,6 -P -R 48000 -C 6 -X audiodump.pcm -o ../$nom_audio.mp4 3>&1 1>&2 2>&3 3>&- & mplayer $dvd_1 $chemin $dvd_2$dvd_3 -aid $trans_audio -vc null -vo null -ao pcm:nowaveheader -channels 6 2>&1 >/dev/null");
    														{
    															local $/ = "\r";
    																while( defined( my $line = $encodage_audio->getline ) ) {
    																	print "      $line" if $line =~ m/(\d+.*\r)$/;
    																}
    														}
    Et voilà, c'est dans la poche

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

Discussions similaires

  1. Filtre sur une partie de la date
    Par souminet dans le forum Débuter
    Réponses: 1
    Dernier message: 12/05/2008, 10h31
  2. Filtré sortie stdout (partie II)
    Par Jjeje007 dans le forum Langage
    Réponses: 2
    Dernier message: 24/06/2007, 17h59
  3. Filtré sorties stdout et stderr avec open()
    Par Jjeje007 dans le forum Langage
    Réponses: 9
    Dernier message: 09/06/2007, 22h52
  4. Réponses: 2
    Dernier message: 27/10/2006, 17h07
  5. filtre sur une partie d'encodage
    Par cuci dans le forum Access
    Réponses: 2
    Dernier message: 03/11/2005, 18h29

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