代码之家  ›  专栏  ›  技术社区  ›  kubi

从不断更新的输出中刷新输出

  •  1
  • kubi  · 技术社区  · 15 年前

    我正试图围绕Lame编写一个简单的脚本,以便为我的特定用途定制程序。我想做的是从Lame输出中解析出完整性百分比。

    下面是这条线现在的样子:

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

    但这不会带来任何回报。以下是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

    最后一行代码在文件转换时动态更新。当我复制/粘贴/回显/将这些精确的文本导入到我的grep中时,它会发现17%很好,但当我真正运行它时,它会发现zilch。

    编辑: 当我将lame的输出放入文本文件时,结果如下:

    lameout.txt

    看起来我可以将输出推送到一个临时文件并从中读取完成百分比,但这感觉很尴尬,好像应该有一种更优雅的方法来实现这一点。

    3 回复  |  直到 4 年前
        1
  •  1
  •   Brian Agnew    15 年前

    curses (允许就地动态更新),因此通过标准输出将有一个有限的输出。

    将输出重定向到一个文件并查看其中写入的内容可能是值得的。即

    lame > /tmp/lame.log
    
        2
  •  1
  •   Rob Napier    15 年前

    lame在未连接到终端时可能不会以相同的方式输出此信息。尝试运行lame命令,并在末尾加上“>output.txt”,查看它连接到另一个进程时打印的内容。

    另一个很可能的可能性是“17%”从未真正打印出来。打印可能是:

    %,向左移动,1,向左移动,2,向左移动3。。。向左移动,向左移动,1,7,向左移动8,等等。

        3
  •  1
  •   kubi    15 年前

    NSScanner 解析输出。每行从 NSTask 已发送到此方法:

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