Frage

Ich versuche, ein einfaches Skript, um Lame zu schreiben, das Programm für meine spezifische Anwendungen anzupassen. Was ich möchte, ist zu tun, analysiert, nur die prozentuale Vollständigkeit des Lame-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. Hier ist, was die Ausgabe von Lame wie folgt aussieht:

    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 Zeile Code dynamisch aktualisiert, wenn die Datei konvertiert wird. Wenn ich Kopieren / Einfügen / echo / Rohr dieser genaue Text in meinen grep findet es das 17% ganz gut, aber wenn ich es wirklich laufe, findet es Zilch.

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

Es sieht aus wie ich die Ausgabe in eine temporäre Datei drücken könnte und den Prozentsatz der Fertigstellung von dort lesen, aber das fühlt sich ungeschickt, wie sollte es eine elegantere Art und Weise, dies zu tun.

War es hilfreich?

Lösung 3

endete mich mit NSScanner bis zu dem Ausgang zu analysieren. Jede Zeile von der NSTask wurde 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];
  }
}

Andere Tipps

Ich vermute, dass Sie nicht in der Lage sein können, dies zu tun. Der Prozentsatz Ausgang wahrscheinlich zum Terminal geht über Flüche (ermöglichen in- stellen dynamische Aktualisierung), und so würde es nur eine begrenzte Ausgabe über stdout sein.

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

lame > /tmp/lame.log

lahm ist wahrscheinlich, diese Informationen nicht in der gleichen Art und Weise ausgibt, wenn nicht mit einem Terminal verbunden. Versuchen Sie, Ihre lame Befehl ausführen mit am Ende „> output.txt“ und schauen, was es ist, wenn Druck an einen anderen Prozess angebracht.

Die andere sehr wahrscheinliche Möglichkeit ist, dass „17%“ wird nie den Ausdruck tatsächlich. Was wahrscheinlich ist Druck ist:

%, links, 1, links, 2, 3 bewegen gelassen, ... links, links, 1, 7, 8 bewegen sich nach links, etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top