1

我正在尝试围绕 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/)
    警告:alpha 版本应仅用于测试
    使用多相低通滤波器,过渡带:16538 Hz - 17071 Hz
    编码 /Users/jkubicek/Desktop/Driver.wav
        到 /Users/jkubicek/Desktop/Driver.mp3
    编码为 44.1 kHz j-立体声 MPEG-1 Layer III (11x) 128 kbps qval=3
    框架 | CPU 时间/估计 | 实时/估计 | 播放/CPU | 预计到达时间
    1500/8765 (17%)| 0:02/ 0:15| 0:03/ 0:17| 14.654x| 0:14

最后一行代码随着文件的转换而动态更新。当我将这个确切的文本复制/粘贴/回显/管道到我的 grep 中时,它发现 17% 就好了,但是当我真正运行它时,它发现了 zilch。

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

lameout.txt

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

4

3 回答 3

1

我怀疑你可能无法做到这一点。百分比输出可能会通过curses进入终端(以允许就地动态更新),因此通过 stdout 的输出将是有限的。

可能值得将输出重定向到文件并查看那里写入的内容。IE

lame > /tmp/lame.log
于 2009-06-21T13:45:31.680 回答
1

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

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

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

于 2009-06-21T13:46:54.377 回答
1

我最终使用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];
  }
}
于 2009-09-16T22:35:32.607 回答