Domanda

Sto cercando di scrivere un semplice script su Lame per personalizzare il programma per i miei usi specifici. Quello che mi piacerebbe fare è analizzare la completezza percentuale dell'output di Lame.

Ecco come appare la linea ora:

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

Ma questo non restituisce nulla. Ecco come appare l'output di 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

L'ultima riga di codice si aggiorna dinamicamente quando il file viene convertito. Quando copio / incolla / echo / pipe questo testo esatto nel mio grep trova il 17% giusto, ma quando lo eseguo davvero, trova zilch.

Modifica: Quando lancio l'output di lame in un file di testo, ecco come appaiono i risultati:

 lameout.txt

Sembra che potrei spingere l'output in un file temporaneo e leggere la percentuale completa da lì, ma mi sembra imbarazzante, come se ci fosse un modo più elegante per farlo.

È stato utile?

Soluzione 3

Ho finito per usare NSScanner per analizzare l'output. Ogni riga da NSTask è stata inviata a questo metodo:

- (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];
  }
}

Altri suggerimenti

Sospetto che potresti non essere in grado di farlo. L'output percentuale probabilmente andrà al terminale tramite curses (per consentire in- posiziona l'aggiornamento dinamico) e quindi ci sarà un output limitato tramite stdout.

Potrebbe valere la pena reindirizzare l'output su un file e vedere cosa viene scritto lì. cioè.

lame > /tmp/lame.log

probabilmente lame non sta trasmettendo queste informazioni allo stesso modo quando non è collegato a un terminale. Prova a eseguire il comando lame con alla fine " > output.txt " e guarda cosa stampa quando è collegato a un altro processo.

L'altra possibilità molto probabile è che "17%" non viene mai realmente stampato. Ciò che probabilmente sta stampando è:

%, sposta a sinistra, 1, sposta a sinistra, 2, sposta a sinistra 3, ... sposta a sinistra, sposta a sinistra, 1, 7, sposta a sinistra 8, ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top