2009-06-21 6 views
1

J'essaye d'écrire un script simple autour de Lame pour personnaliser le programme pour mes usages spécifiques. Ce que je voudrais faire est analyser juste le pourcentage de complétude de la sortie de Lame.grep'ing sortie de sortie continuellement mis à jour

Voici ce que la ligne ressemble maintenant:

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

Mais cela ne renvoie rien. Voici ce que la sortie de Boiteux ressemble:

 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 met à jour dynamiquement le fichier est converti. Quand je copie/colle/echo/pipe ce texte exact dans mon grep il trouve les 17% très bien, mais quand je l'exécute pour vrai, il trouve zilch.

Edit: Quand je jette la sortie de lame dans un fichier texte, voici ce que les résultats ressemblent:

lameout.txt http://nothing2fancy.com/images/forum_images/lameout.txt-20090621-095324.png

On dirait que je pouvais pousser la sortie vers un fichier temporaire et lire le pourcentage est complet, mais cela semble gênant, comme il devrait y avoir une façon plus élégante de le faire.

Répondre

1

I fini par utiliser NSScanner pour analyser la sortie. Chaque ligne du NSTask a été envoyé à 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]; 
    } 
} 
1

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

Il peut être utile de rediriger la sortie vers un fichier et de voir ce qui y est écrit. à savoir

lame > /tmp/lame.log 
+0

Merci pour la suggestion. J'ai vérifié le fichier de sortie et il tient toutes les mises à jour individuelles de pourcentage sur des lignes séparées. Donc, la lecture de chacun devrait être possible. – kubi

+0

Il est également possible que lame affiche vos chiffres puis affiche^H (ou backspaces). Ainsi, grep peut ne pas obtenir de retour chariot pour lui permettre d'identifier une EOL. Lame peut également changer sa sortie en fonction de l'endroit où stdout est envoyé –

1

lame est probablement pas délivrer en sortie ces informations de la même façon sans être connecté à un terminal. Essayez d'exécuter votre commande lame à la fin "> output.txt" et regardez ce qu'elle imprime lorsqu'elle est attachée à un autre processus.

L'autre possibilité très probable est que "17%" n'est jamais réellement imprimé. Ce qui est probablement l'impression est:

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