Pergunta

Eu estou tentando escrever um script simples em torno de Lame para personalizar o programa para os meus usos específicos. O que eu gostaria de fazer é analisar fora apenas o percentual de completude da saída Lame.

Aqui está o que os olhares linha como agora:

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

Mas isso não retornar nada. Aqui está o que a saída do Lame parece com:

    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

A última linha de código atualiza dinamicamente como o arquivo é convertido. Quando eu copiar / colar / echo / cachimbo este texto exato em meu grep encontra a 17% muito bem, mas quando eu executá-lo de verdade, ele encontra zilch.

Edit: Quando eu jogar a saída de coxo em um arquivo de texto, aqui é o que os resultados parecido:

lameout.txt

Parece que eu poderia empurrar a saída para um arquivo temporário e ler a porcentagem fora completa de lá, mas que se sente estranho, que deve haver uma maneira mais elegante de fazer isso.

Foi útil?

Solução 3

Acabei usando NSScanner para analisar a saída. Cada linha do NSTask foi enviado 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];
  }
}

Outras dicas

Eu suspeito que você pode não ser capaz de fazer isso. A saída percentual provavelmente irá para o terminal via maldições (para permitir a in- lugar dinâmico atualização), e assim haverá uma saída limitada via stdout.

Pode valer a pena redirecionando a saída para um arquivo e ver o que é escrito lá. i.

lame > /tmp/lame.log

coxo provavelmente não está a emitir esta informação da mesma maneira quando não estiver conectado a um terminal. Tente executar o seu comando coxo com no final "> output.txt" e olhar para o que está sendo impresso quando ligado a outro processo.

A outra possibilidade muito provável é que "17%" é nunca realmente imprimir. O que provavelmente é a impressão é:

%, mover para a esquerda, um, mover para a esquerda, dois, três mover para a esquerda, ... mover para a esquerda, mover para a esquerda, 1, 7, 8 mover para a esquerda, etc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top