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é sorties stdout et stderr avec open()


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é sorties stdout et stderr avec open()
    Salut a tous,

    Pour mon premier deuxième post sur ce forum, j'ai un probleme... (étant pratiquement nouveau dans le monde de la programation, j'essayerai de me rattrapper mais c'est pas demain la veille )

    Je suis en train d'essayer d'ecrire un script perl afin d'automatiser mes backups dvd. Pour l'instant, je me suis concentré sur l'encodage de la video.
    Pour info, je tourne sous gentoo et ma version de perl est 5.8.8.

    D'autres part, j'avais commencé a écrire ce script sous bash avant de m'interresser a perl, donc voila ce que ca donne sous bash :

    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
    32
    33
    34
    #!/bin/sh
    # Color
    RD="\\033[1;31m" ## Red
    NM="\\033[0;39m" ## Normal
     
    StartDateG=`date +'%A %d %B'`
    StartTimeG=`date +%H:%M:%S`
     
    ## Premiere Pass ###
    /usr/bin/time mencoder VTS_01_0.VOB -of rawvideo -ovc x264 -x264encopts bitrate=3622:pass=1:subq=4:8x8dct:me=dia:frameref=5:bframes=2:b_pyramid:weight_b:direct_pred=auto:partitions=all:qcomp=0.75:ip_factor=1.10:pb_factor=1.40 -nosound -o /dev/null > encodage_pass1.log 2>&1
    tps_pass1=`cat encodage_pass1.log | grep "user" | tr -d [:alpha:] | awk '{print $3}'`
     
     
    ## Deuxieme Pass ###
     
    /usr/bin/time mencoder VTS_01_0.VOB -of rawvideo -ovc x264 -x264encopts bitrate=3622:pass=3:subq=5:8x8dct:me=hex:frameref=5:bframes=2:b_pyramid:weight_b:direct_pred=auto:partitions=all:qcomp=0.75:ip_factor=1.10:pb_factor=1.40:trellis=1:threads=2 -nosound -o /dev/null > encodage_pass2.log 2>&1
    tps_pass2=`cat encodage_pass2.log | grep "user" | tr -d [:alpha:] | awk '{print $3}'`
     
    ## Troisieme Pass ###
     
    /usr/bin/time mencoder VTS_01_0.VOB -of rawvideo -ovc x264 -x264encopts bitrate=3622:pass=2:subq=6:8x8dct:me=umh:frameref=5:bframes=2:b_pyramid:weight_b:direct_pred=auto:partitions=all:qcomp=0.75:ip_factor=1.10:pb_factor=1.40:brdo:trellis=2:threads=2 -nosound -o video.264 > encodage_pass3.log 2>&1
    tps_pass3=`cat encodage_pass3.log | grep "user" | tr -d [:alpha:] | awk '{print $3}'`
     
     
    # Fin ###
     
    EndDateG=`date +'%A %d %B'`
    EndTimeG=`date +%H:%M:%S`
     
    echo "Encodage lancé le ${StartDateG} à ${StartTimeG}."
    echo "Encodage terminé le ${EndDateG} à ${EndTimeG}."
    echo "La première pass a durée ${tps_pass1} minutes"
    echo "La seconde : ${tps_pass2} minutes"
    echo "Et la dernière : ${tps_pass3} minutes"
    Et voila ce que ca donne lors de l'execution :

    jerome@Dressing1 ~ $ ./x264-encodage-mod
    Encodage lancé le dimanche 03 juin à 19:33:30.
    Encodage terminé le dimanche 03 juin à 19:33:47.
    La première pass a durée 0:03.25 minutes
    La seconde : 0:04.13 minutes
    Et la dernière : 0:08.72 minutes
    Le seul problème c'est que je n'ai pas la progression de l'encodage, alors que mencoder (le program d'encodage) l'affiche si il est lancé sans la redirection du stdout dans mes fichiers de log (encodage_pass1.log, encodage_pass2.log et encodage_pass3.log)

    Et c'est la que j'aimerais filtré le output de mencoder et ne garder que l'affichage de la progression de l'encodage, qui est donné comme ca dans mon shell :

    Pos: 0.6s 18f (99%) 6.22fps Trem: 0min 0mb A-V:0.000 [0:0]
    Et de mettre tout le reste dans des fichiers logs.
    Voila le output de la premiere pass sans rediriger quoi que ce soit dans un fichier :

    MEncoder dev-SVN-r23401 (C) 2000-2007 MPlayer Team
    CPU: AMD Athlon(tm) processor (Family: 6, Model: 4, Stepping: 4)
    CPUflags: Type: 6 MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 0 SSE2: 0
    Compilé avec détection du CPU à l'exécution.112 codecs audio & 235 codecs vidéo
    succès : format : 0 data : 0x0 - 0x18e800
    Fichier de type MPEG-PS détecté.
    VIDEO: MPEG2 720x576 (aspect 3) 25.000 fps 8000.0 kbps (1000.0 kbyte/s)
    [V] filefmt:2 fourcc:0x10000002 size:720x576 fps:25.00 ftime:=0.0400
    Ouverture du filtre vidéo : [expand osd=1]
    Expand: -1 x -1, -1 ; -1, osd: 1, aspect: 0.000000, round: 1
    ==========================================================================
    Ouverture du décodeur vidéo : [mpegpes] MPEG 1/2 Video passthrough
    VDec : requête de config de vo - 720 x 576 (espace colorimétrique préferé : Mpeg PES)
    N'a pas pu trouver espace colorimétrique correspondant - nouvel essai avec -vf scale...
    Ouverture du filtre vidéo : [scale]
    Le périphérique de sortie vidéo sélectionné est incompatible avec ce codec.
    Essayer d'ajouter le filtre d'échelle, e.g. -vf spp,scale plutôt que -vf spp.
    Echec de l'initialisation de VDecoder
    Famille de codecs vidéo demandée [mpeg12] (vfm=libmpeg2) non disponible (activez-la à la compilation)
    Ouverture du décodeur vidéo : [ffmpeg] FFmpeg's libavcodec codec family
    Codec vidéo choisi : [ffmpeg2] vfm : ffmpeg (FFmpeg MPEG-2)
    ==========================================================================
    VDec : requête de config de vo - 720 x 576 (espace colorimétrique préferé : Planar YV12)
    VDec: using Planar I420 as output csp (no 1)
    L'aspect du film est 1.78:1 - pré-redimensionnement à l'aspect correct.
    x264 [info]: using SAR=64/45
    x264 [info]: using cpu capabilities MMX MMXEXT 3DNow!
    New_Face failed. Maybe the font path is wrong.
    Please supply the text font file (~/.mplayer/subfont.ttf).
    subtitle font: load_sub_face failed.
    New_Face failed. Maybe the font path is wrong.
    Please supply the text font file (~/.mplayer/subfont.ttf).
    subtitle font: load_sub_face failed.
    Pos: 0.6s 18f (99%) 6.22fps Trem: 0min 0mb A-V:0.000 [0:0]
    Flushing video frames.

    Flux vidéo : 2991.318 kbit/s (373914 B/s) taille : 254262 octets 0.680 secs 18 images
    x264 [info]: slice I:2 Avg QP:20.00 size: 35316
    x264 [info]: slice P:15 Avg QP:22.60 size: 12201
    x264 [info]: mb I I16..4: 21.8% 32.2% 46.0%
    x264 [info]: mb P I16..4: 14.8% 14.0% 12.3% P16..4: 34.2% 0.8% 0.6% 0.2% 0.2% skip:22.8%
    x264 [info]: final ratefactor: 18.10
    x264 [info]: 8x8 transform intra:33.5% inter:53.2%
    x264 [info]: ref P 19.6% 0.7% 28.3% 50.8% 0.6%
    x264 [info]: kb/s:2984.1
    Tout ce qui est après le Pos: 0.6s 18f (99%) 6.22fps Trem: 0min 0mb A-V:0.000 [0:0] est donné a la fin de l'encodage. Par ailleur, cette ligne (Pos: ...) est interactive.

    Alors, est-ce possible avec perl de faire ce genre de chose
    J'avais commencé à écrire le script, et voilà ou j'en suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/perl -w
     
    use strict;
    my $pass_1 = `mencoder VTS_01_0.VOB -of rawvideo -ovc x264 -x264encopts bitrate=3622:pass=1:subq=4:8x8dct:me=dia:frameref=5:bframes=2:b_pyramid:weight_b:direct_pred=auto:partitions=all:qcomp=0.75:ip_factor=1.10:pb_factor=1.40 -nosound -o /dev/null`;
    open ( PASS_1, "$pass_1 2>&1 |" );
    while (<PASS_1>) { }
    Apres le "while", je sais vraiment pas comment m'y prendre

    Jjeje007

    Note : Désolé pour le roman

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par Jjeje007
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/perl -w
     
    use strict;
    my $pass_1 = `mencoder VTS_01_0.VOB -of rawvideo -ovc x264 -x264encopts bitrate=3622:pass=1:subq=4:8x8dct:me=dia:frameref=5:bframes=2:b_pyramid:weight_b:direct_pred=auto:partitions=all:qcomp=0.75:ip_factor=1.10:pb_factor=1.40 -nosound -o /dev/null`;
    open ( PASS_1, "$pass_1 2>&1 |" );
    while (<PASS_1>) { }
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/bin/perl
    use strict; use warnings;
    $|++;
     
    use IO::Pipe;
    my $pipe = new IO::Pipe();
    $pipe->reader(qw{mencoder VTS_01_0.VOB -of rawvideo -ovc x264 -x264encopts bitrate=3622:pass=1:subq=4:8x8dct:me=dia:frameref=5:bframes=2:b_pyramid:weight_b:direct_pred=auto:partitions=all:qcomp=0.75:ip_factor=1.10:pb_factor=1.40 -nosound -o /dev/null});
     
    { 
      local $/ = "\r";
      while( defined( my $line = $pipe->getline ) ) {
        print $1 if $line =~ m/(Pos.*\r)$/;
      }
    }
    --
    Jedaï

  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
    Merci !!

    Ca marche a peu près, mais il laisse encore passer ca :

    Le périphérique de sortie vidéo sélectionné est incompatible avec ce codec.
    Essayer d'ajouter le filtre d'échelle, e.g. -vf spp,scale plutôt que -vf spp.
    Famille de codecs vidéo demandée [mpeg12] (vfm=libmpeg2) non disponible (activez-la à la compilation)
    x264 [info]: using SAR=64/45
    x264 [info]: using cpu capabilities MMX MMXEXT 3DNow!
    New_Face failed. Maybe the font path is wrong.
    Please supply the text font file (~/.mplayer/subfont.ttf).
    subtitle font: load_sub_face failed.
    New_Face failed. Maybe the font path is wrong.
    Please supply the text font file (~/.mplayer/subfont.ttf).
    subtitle font: load_sub_face failed.
    Apperement, il laisse passer le stderr

    Autre chose, je n'ai pas compris ce que faisait ca :

    En tout cas, un grand merci et je vais potasser tout ca

    Jjeje007

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 606
    Par défaut
    Rajoute un open sur le canal STDERR dans ton script, ça te fera ainsi un log sur les messages d'erreur

  5. #5
    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
    Citation Envoyé par Arioch
    Rajoute un open sur le canal STDERR dans ton script, ça te fera ainsi un log sur les messages d'erreur
    En effet, merci !!
    Pour info, voila le script "final" :

    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    $|++;
    open(STDERR, ">encodage_error.log" ) or die "cannot redirect stderr output in log file : $!\n";
    use IO::Pipe;
    my $pipe = new IO::Pipe();
    $pipe->reader(qw{mencoder VTS_01_0.VOB -of rawvideo -ovc x264 -x264encopts bitrate=3622:pass=1:subq=4:8x8dct:me=dia:frameref=5:bframes=2:b_pyramid:weight_b:direct_pred=auto:partitions=all:qcomp=0.75:ip_factor=1.10:pb_factor=1.40 -nosound -o /dev/null });
    {
    local $/ = "\r";
    while( defined( my $line = $pipe->getline ) ) {
    print $1 if $line =~ m/(Pos.*\r)$/;
       }
    }
    merci a vous deux

    Jjeje007

  6. #6
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par Jjeje007
    Autre chose, je n'ai pas compris ce que faisait ca :

    $| est la variable spéciale en Perl qui contrôle le "buffering" (l'utilisation du tampon) sur le filehandle courant (STDOUT si tu n'as pas utilisé select() pour en changer), on dit qu'elle contrôle l'"autoflush", autrement dit si elle est placé à une valeur vraie (elle est initialement à 0 et mon ++ la met à 1, soit une valeur vraie), un flush est effectué après chaque print().
    Si l'autoflush n'est pas activé, certaines plateformes ont tendance à attendre qu'un "\n" soit écrit pour vider le tampon. Autrement dit ici on n'écrit pas de \n, seulement des \r, donc si je n'activais pas l'autoflush, l'affichage ne se ferait qu'à la fin du film... (je pense : à vrai dire ça dépend de la plateforme, ou même du terminal)

    --
    Jedaï

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

    Je me permet de réouvrir ce sujet, car la je suis tombé sur un os (et un de plus)
    Pour faire plus simple, je vais vous donnez mon script en entier (pas tapper, y a pas de "use strict;" ) :

    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
    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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    #!/usr/bin/perl 
    # Copyright Jjeje007
    # Distributed under the terms of the GNU General Public License, v2 (or above)
    # Get an copy from http://www.fsf.org/licensing/licenses/gpl.txt (v2)
    # Traduction non officielle --> http://fsffrance.org/gpl/gpl-fr.fr.html
    #
    # Script d'encodage de dvd / fichier video utilisant mplayer
    #
     
    use IO::Pipe;
     
    # Mise en place du welcome :p
     
    print "-_- Script d'encodage video en x264 -_-\n";
     
    my $dateS = `date +'%A %d %B'`; chomp $dateS;
    my $timeS = `date +%H:%M:%S`; chomp $timeS;
     
    print "INFO : Lancement du script effectué le $dateS à $timeS.\n";
     
    #### loop pour les questions
     
    # Chemin
     
    print "       Voulez-vous rippez un fichier video ou un dvd ?\n";
    print "       Tappez fichier ou dvd :\n";
     
    $inp_1 = <STDIN>;  chomp $inp_1;
     
      if ($inp_1 eq "fichier" ) {       
               print "       Vous avez choisi de ripper un fichier video.\n";
               do {
               print "       Donnez-moi le chemin complet vers le fichier video :\n";
                  $chemin = <STDIN>; chomp $chemin;
                     if ( -f $chemin && -r $chemin && -w $chemin ) {
                           $dvd_1 = "";
                           $dvd_2 = "";
                           $dvd_3 = "";                       
                           $sortie_f = "10";
                           }
                     else {
                           print "WARN : Fichier non trouvé ou non disponible en lecture/écriture !\n";
                           print "WARN : Soyez sur que le fichier existe et qu'il est accessible en lecture/écriture ...\n";
                           $sortie_f = "20";
                           }
               } until ( $sortie_f eq "10" );
           }
      elsif ($inp_1 eq "dvd" ) {
                print "       Vous avez choisi de ripper un dvd.\n";
               do {
                print "       Donnez-moi le chemin complet vers le fichier dvd monté :\n";
                  $chemin = <STDIN>; chomp $chemin;
                     if ( -d $chemin && -r $chemin ) {
                           $dvd_1 = "-dvd-device";
                           $sortie_d_1 = "10";
                           }
                     else {
                           print "WARN : Repertoire non trouvé ou non disponible en lecture !\n";
                           print "WARN : Soyez sur que le dvd est monté et qu'il soit accessible en lecture ...\n";
                           my $sortie_d_1 = "20";
                           }
                   } until ( $sortie_d_1 eq "10" );         
                print "       Donnez-moi, aussi, le numéro du titre du dvd à ripper.\n";
                print "       Il va vous falloir tout d'abord testé le numero du titre avec mplayer.\n";
                print "       Vous pouvez le faire de cette façon :\n";
                print "       mplayer -dvd-device /chemin/vers/le/dossier/VIDEO_TS dvd://'numero du titre'\n";
                print "       Et soyez sure que vous avez bien le film au complet !\n";            
                do {
                print "       Maintenant, donnez moi le numéro du titre du dvd à ripper (exemple : 1,2,3 ...) :\n";
                   $dvd_3 = <STDIN>; chomp $dvd_3;
                    if ( $dvd_3 =~ /\d+/ ) {
                          $dvd_2 = "dvd://";
                          $sortie_d_2 = "10";
                          }
                    elsif ( $dvd_2 eq "" ) {
                          print "WARN : Vous n'avez rien tappez !\n";
                          print "WARN : J'assume que le numero de piste est le 1 (le plus courant).\n";
                          $dvd_2 = "dvd://";
                          $dvd_3 = "1";                      
                          $sortie_d_2 = "10";
                          }
                    else  {
                          print "WARN : Vous devez tappez un chiffre ! ...\n";
                          $sortie_d_2 = "20";
                          }
                    } until ( $sortie_d_2 eq "10" );
             }
        else {
             die "CRIT : Vous devez tappez 'dvd' ou 'fichier' !\n";
             }
     
    # Fin de la premiere boucle
     
    # Bitrate
     
    do {
    print "       Maintenant donnez-moi le bitrate de la video :\n";
    $inp_2 = <STDIN>;  chomp $inp_2;
            if ( $inp_2 =~ /\d+/ ) {
                $sortie_bitrate = "10";
                }
            else {
                print "WARN : Vous devez tapper quelque chose en chiffre ! ...\n";
                $sortie_bitrate = "20";
                  }
       } until ( $sortie_bitrate eq "10" );
     
    # Fin deuxieme boucle
     
    # Crop
     
    print "       Donnez-moi l'indice de croppage.\n";
    print "       Vous pouvez l'obtenir grâce à mplayer et son filtre autocrop :\n";
    print "       mplayer $chemin $dvd_1 $dvd_2 $dvd_3 -ao null -vo null -vf cropdetect -sb 50000000\n";
     
    do {
    print "       Croppage (exemple : 720:480:0:20) :\n";
    $inp_3 = <STDIN>;  chomp $inp_3;
             if ( $inp_3 =~ /\d+:\d+:\d+:\d+/ ) {
                $sortie_croppage = "10";
                }
            else {
                print "WARN : Vous devez tapper quelque chose de la forme : 720:480:0:20 ! ...\n";
                $sortie_croppage = "20";
                 }
        } until ( $sortie_croppage eq "10" );
     
    # Chemin de sauvegarde du rip
     
    print "       Maintenant, il va me falloir un répertoire où sauvegarder la video.\n";
    print "       Donnez moi le chemin complet vers ce répertoire.\n";
    print "       Bien entendu, il vous faut le créer auparavant et qu'il soit disponible en lecture / ecriture.\n";
     
    do {
    print "       Répertoire :\n";
    $inp_4 = <STDIN>;  chomp $inp_4;
            if ( -d $inp_4 && -r $inp_4 && -w $inp_4 ) {
                $sortie_svg = "10";
                 }
            else {
               print "WARN : Répertoire non trouvé ou non disponible en lecture / écriture ! ...\n";
               $sortie_svg = "20";
                 }
       } until ( $sortie_svg eq "10" );
     
    # Résumé
     
    print "--------------------------------------------------------------------\n";
    print "                             Résumé\n";
    print "--------------------------------------------------------------------\n";
    print "[*] Chemin vers la vidéo a ripper : $chemin\n";
    print "[*] Options dvd (si dvd il y a) :   $dvd_2$dvd_3\n";
    print "[*] Bitrate :                       $inp_2\n";
    print "[*] Crop :                          $inp_3\n";
    print "[*] Répertoire de sauvegarde :      $inp_4\n";
    print "--------------------------------------------------------------------\n";
     
    # Lancement encodage ?
     
    do {
    print "       Voulez-vous lancez l'encodage [O/N] (case SenSiTive) ? :\n";
    $inp_5 = <STDIN>;  chomp $inp_5;
           if ( $inp_5 eq "O" ) {
             print "       Lancement de l'encodage :D\n";
             $sortie_encodage = "10";
              }
           elsif ( $inp_5 eq "N" ) {
             die "       Bye .... :(\n";
             $sortie_encodage = "10";
                }
           else {
             print "WARN : Vous devez tapper O ou N !\n";
             $sortie_encodage = "20";
                }
    } until ( $sortie_encodage = "10" );
     
    # Lancement de l'encodage
    # Changement de répertoire vers le répertoire choisi en tant que sauvegarde
    chdir $inp_4;
     
    # On redirige toutes les erreurs vers un fichier log qui sera créer dans 
    # le repertoire de sauvegarde
     
    open(STDERR, ">encodage_error.log" ) or die "cannot redirect stderr output in log file : $!\n";   
     
    # 1ere pass
     
    print "INFO : 1ère pass ...\n";
     
    $|++;
    my $pipe1 = new IO::Pipe(); 
    $pipe1->reader(qw{mencoder $dvd_1 $chemin $dvd_2$dvd_3 -of rawvideo -ovc x264 -x264encopts bitrate=$inp_2:pass=1:subq=4:8x8dct:me=dia:frameref=5:bframes=2:b_pyramid:weight_b:direct_pred=auto:partitions=all:qcomp=0.75:ip_factor=1.10:pb_factor=1.40:threads=2 -vf crop=$inp_4 -nosound -o /dev/null });   
    { 
    local $/ = "\r"; 
    while( defined( my $line1 = $pipe1->getline ) ) {  
    print $1 if $line1 =~ m/(Pos.*\r)$/; 
       } 
    }
     
    # 2ème pass
    print "-------------\n";
    print "INFO : 2ème pass ...\n";
     
    $|++;
    my $pipe_2 = new IO::Pipe();
    $pipe_2->reader(qw{mencoder -of rawvideo -ovc x264 -x264encopts bitrate=:pass=3:subq=5:8x8dct:me=hex:frameref=5:bframes=2:b_pyramid:weight_b:direct_pred=auto:partitions=all:qcomp=0.75:ip_factor=1.10:pb_factor=1.40:trellis=1:threads=2 -vf crop= -nosound -o /dev/null });
    {
    local $/ = "\r";
    while( defined( my $line_2 = $pipe_2->getline ) ) {
    print $1 if $line_2 =~ m/(Pos.*\r)$/;
       }
    }
     
    # 3ème pass
     
    print "-------------\n";
    print "INFO : 3ème pass ...\n";
     
    $|++;
    my $pipe_3 = new IO::Pipe();
    $pipe_3->reader(qw{mencoder -of rawvideo -ovc x264 -x264encopts bitrate=:pass=2:subq=6:8x8dct:me=umh:frameref=5:bframes=2:b_pyramid:weight_b:direct_pred=auto:partitions=all:qcomp=0.75:ip_factor=1.10:pb_factor=1.40:brdo:trellis=2:threads=2 -vf crop= -nosound -o video.264 });
    {
    local $/ = "\r";
    while( defined( my $line_3 = $pipe_3->getline ) ) {
    print $1 if $line_3 =~ m/(Pos.*\r)$/;
       }
    }
     
    my $dateF = `date +'%A %d %B'`; chomp $dateF;
    my $timeF = `date +%H:%M:%S`; chomp $timeF;
    print "-------------\n";
    print "Encodage terminé le $dateF à $timeF\n";
     
    # Fin du script
    Bon le problème, c'est qu'après le :
    $pipe_3->reader(qw{
    Ben les variables ne passent plus (cf la # 1ere pass)
    Alors, comment insérer des variables, sans abandonné "l'épurement" du stdout (ecrire une fonction ??)

    Jjeje007

  8. #8
    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,

    Apparament, il n'est pas possible d'inserer des variables après qw() ??

    Personne pour me donner un coup de main ?
    (ca fait deux jours que je cherche ....)

    Jjeje007

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/05/2008, 00h46
  2. Filtré sortie stdout (partie 3) (mkfifo inside)
    Par Jjeje007 dans le forum Langage
    Réponses: 3
    Dernier message: 13/07/2007, 00h41
  3. Filtré sortie stdout (partie II)
    Par Jjeje007 dans le forum Langage
    Réponses: 2
    Dernier message: 24/06/2007, 17h59
  4. Réponses: 2
    Dernier message: 27/10/2006, 17h07
  5. Problème d'E.S. sur fichier avec open
    Par Bubonik software dans le forum C
    Réponses: 6
    Dernier message: 04/02/2004, 19h42

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