2009-06-21 5 views
1

Ich versuche, ein einfaches Skript um Lame zu schreiben, um das Programm für meine spezifischen Verwendungen anzupassen. Was ich tun möchte, ist nur die prozentuale Vollständigkeit aus der Lame-Ausgabe zu analysieren.grep'ing Ausgabe von kontinuierlich aktualisierten Ausgang

Hier ist, was die Zeile wie jetzt aussieht:

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

Aber das gibt nichts zurück. So sieht die Ausgabe von Lame aus:

 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

Die letzte Codezeile wird dynamisch aktualisiert, wenn die Datei konvertiert wird. Wenn ich diesen genauen Text in meinen Grep kopiere/einfüge/zurückliege, finde ich die 17% ganz gut, aber wenn ich ihn richtig benutze, findet er zilch.

Edit: Wenn ich die Ausgabe von lame in eine Textdatei werfen, hier ist das, was die Ergebnisse wie folgt aussehen:

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

Es sieht aus wie ich die Ausgabe in eine temporäre Datei drücken könnte und lesen der Prozentsatz, der dort erreicht wird, aber das fühlt sich peinlich an, als sollte es einen eleganteren Weg geben, dies zu tun.

Antwort

1

I endete mit NSScanner zum Parsen der Ausgabe. Jede Zeile von der NSTask wurde an diese Methode gesendet:

- (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

Ich vermute, dass Sie dies möglicherweise nicht können. Die prozentuale Ausgabe wird wahrscheinlich über curses an das Terminal gehen (um eine direkte dynamische Aktualisierung zu ermöglichen), und so wird es eine begrenzte Ausgabe über stdout geben.

Es kann sich lohnen, die Ausgabe in eine Datei umzuleiten und zu sehen, was dort geschrieben wird. d. h.

lame > /tmp/lame.log 
+0

Danke für den Vorschlag. Ich überprüfte die Ausgabedatei und es enthält alle einzelnen Prozentaktualisierungen in separaten Zeilen. Also sollte jedes Lesen möglich sein. – kubi

+0

Es ist auch möglich, dass lame Ihre Figuren ausgibt und dann^H (oder Backspaces) ausgibt. Daher kann grep keinen Wagenrücklauf erhalten, um eine EOL identifizieren zu können. Lame kann auch seine Ausgabe ändern, abhängig davon, wohin stdout gesendet wird –

1

lame gibt diese Informationen wahrscheinlich nicht auf dieselbe Weise aus, wenn sie nicht an ein Terminal angeschlossen sind. Versuchen Sie, Ihren lame-Befehl am Ende mit "> output.txt" auszuführen und schauen Sie, was gedruckt wird, wenn er an einen anderen Prozess angehängt wird.

Die andere sehr wahrscheinliche Möglichkeit ist, dass "17%" niemals wirklich gedruckt wird. Was wahrscheinlich ist Druck ist:

%, nach links, 1, nach links, 2, 3 bewegen links, ... nach links bewegen, nach links, 1, 7, 8 nach links bewegen, usw.