2009-06-21 6 views
1

私は特定の目的のためにプログラムをカスタマイズするためにLameの周りに簡単なスクリプトを書こうとしています。私がしたいのは、Lame出力から完全なパーセンテージだけを解析することです。継続的に更新された出力からのgrep'ing出力

はここでラインが今のようになります:

./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が見つかります。

編集: 私はテキストファイルにラメからの出力を投げるときは、ここでの結果はどのように見えるかです:

lameout.txt http://nothing2fancy.com/images/forum_images/lameout.txt-20090621-095324.png

私は一時ファイルへの出力をプッシュして読むことができるように見えますそこから完成したパーセンテージが、これを行うもっとエレガントな方法があるように、それは不自然に感じます。

答えて

1

など、8を残しました出力を解析するために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]; 
    } 
} 
1

私はあなたがこれを行うことができないと思われます。出力のパーセンテージはおそらくcursesを介して(インプレース動的更新を許可するために)端末に送られるので、stdout経由で出力が制限されます。

出力をファイルにリダイレクトして、そこに書き込まれる内容を確認することをお勧めします。すなわち、

lame > /tmp/lame.log 
+0

お寄せいただきありがとうございます。私は出力ファイルをチェックし、個々のパーセンテージアップデートを別々の行に保持しています。だから、それぞれを読むことが可能でなければなりません。 – kubi

+0

lameがあなたの数字を出力し、^ H(またはバックスペース)を出力することも可能です。したがって、grepはEOLを識別できるようにキャリッジリターンを取得しないことがあります。 Lameはまた、stdoutがどこに送られているかによって出力を変えるかもしれません –

1

lameは端末に接続していない場合と同じ方法でこの情報を出力していない可能性があります。最後の "> output.txt"でlameコマンドを実行して、別のプロセスにアタッチしたときに何が印刷されているのかを見てください。

もう1つの可能性は、「17%」が決して実際に印刷されないことです。何はおそらく印刷されている:、動きは、3を

%、左に移動、1、左に移動、2左...移動は左、左に移動、1、7、動きは私が

関連する問題