Question

J'essaie d'écrire un script simple autour de Lame pour personnaliser le programme en fonction de mes utilisations spécifiques. Ce que je voudrais faire, c’est d’analyser uniquement le pourcentage d’exhaustivité de la sortie de Lame.

Voici à quoi ressemble la ligne:

./lame --nohist ~/Desktop/Driver.wav ~/Desktop/Driver.mp3 2>&1| egrep -o "\([0-9\%]+\)"

Mais cela ne retourne rien. Voici à quoi ressemble le résultat de Lame:

    LAME 3.99 (alpha 1, Jun  4 2009 19:42:31) 32bits (http://www.mp3dev.org/)
    warning: alpha versions should be used for testing only
    Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz
    Encoding /Users/jkubicek/Desktop/Driver.wav
        to /Users/jkubicek/Desktop/Driver.mp3
    Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3
    Frame          |  CPU time/estim | REAL time/estim | play/CPU |    ETA 
    1500/8765   (17%)|    0:02/    0:15|    0:03/    0:17|   14.654x|    0:14

La dernière ligne de code est mise à jour de manière dynamique au fur et à mesure de la conversion du fichier. Lorsque je copie / colle / echo / dirige ce texte exact dans mon grep, il trouve parfaitement les 17%, mais lorsque je le lance réellement, il trouve zilch.

Modifier: Lorsque je jette la sortie de lame dans un fichier texte, voici à quoi ressemblent les résultats:

 lameout.txt

Il semble que je puisse transférer la sortie dans un fichier temporaire et lire le pourcentage complet, mais cela semble difficile, car il devrait y avoir un moyen plus élégant de le faire.

Était-ce utile?

La solution 3

J'ai fini par utiliser NSScanner pour analyser le résultat. Chaque ligne du NSTask a été envoyée à cette méthode:

- (NSNumber *)parseOutputString:(NSString *)output {
  NSScanner *scanner = [NSScanner scannerWithString:output];
  NSString *endString = @"% complete";
  NSInteger percentComplete;
  BOOL didFindNumber = NO;

  while (![scanner scanString:endString intoString:nil]) {
        [scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:nil];
        didFindNumber = [scanner scanInteger:&percentComplete];

        if ([scanner isAtEnd]) {
              didFindNumber = NO;
              break;
        }
  }

  if (didFindNumber) {
        return [NSNumber numberWithInteger:percentComplete];
  } else {
        return [NSNumber numberWithInt:0];
  }
}

Autres conseils

Je suppose que vous ne pourrez peut-être pas faire cela. Le pourcentage de sortie ira probablement au terminal via cursus (pour permettre mettre à jour dynamique), et donc il y aura une sortie limitée via stdout.

Il peut être intéressant de rediriger la sortie vers un fichier et de voir ce qui y est écrit. c'est-à-dire

lame > /tmp/lame.log

lame n’émet probablement pas cette information de la même manière s’il n’est pas connecté à un terminal. Essayez d’exécuter votre commande boiteuse à la fin " > output.txt " et regardez ce que vous imprimez lorsqu'il est associé à un autre processus.

L’autre possibilité très probable est que " 17% " n'est jamais en train d'imprimer. Ce qui est probablement l’impression, c’est:

%, déplacer à gauche, 1, déplacer à gauche, 2, déplacer à gauche 3, ... déplacer à gauche, déplacer à gauche, 1, 7, déplacer à gauche 8, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top