Pregunta

Estoy tratando de escribir un script simple alrededor de Lame para personalizar el programa para mis usos específicos. Lo que me gustaría hacer es analizar solo el porcentaje de integridad de la salida Lame.

Así es como se ve la línea ahora:

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

Pero eso no devuelve nada. Así es como se ve la salida 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 última línea de código se actualiza dinámicamente a medida que se convierte el archivo. Cuando copio / pego / echo / pipe este texto exacto en mi grep, encuentra que el 17% está bien, pero cuando lo ejecuto de verdad, encuentra zilch.

Editar: Cuando lanzo la salida de cojo a un archivo de texto, así es como se ven los resultados:

 lameout.txt

Parece que podría enviar la salida a un archivo temporal y leer el porcentaje completo de allí, pero eso se siente incómodo, como si hubiera una forma más elegante de hacerlo.

¿Fue útil?

Solución 3

Terminé usando NSScanner para analizar la salida. Cada línea del NSTask se envió a este método:

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

Otros consejos

Sospecho que es posible que no puedas hacer esto. El porcentaje de salida probablemente irá a la terminal a través de curses (para permitir colocar actualización dinámica), por lo que habrá una salida limitada a través de stdout.

Puede valer la pena redirigir la salida a un archivo y ver qué se escribe allí. es decir

lame > /tmp/lame.log

cojo probablemente no está emitiendo esta información de la misma manera cuando no está conectado a un terminal. Intente ejecutar su comando lame con al final " > output.txt " y mira lo que se imprime cuando se adjunta a otro proceso.

La otra posibilidad muy probable es que "17%" en realidad nunca se imprime. Lo que probablemente es la impresión es:

%, mover a la izquierda, 1, mover a la izquierda, 2, mover a la izquierda 3, ... mover a la izquierda, mover a la izquierda, 1, 7, mover a la izquierda 8, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top