2009-12-01 15 views
6

私はpowershellとffmpegツールを使ってビデオの変換を自動化しようとしています。 Ffmpegは、すべてのネッセサリパラメータなしで呼び出された場合、ビデオに関する詳細な出力を持っています。通常、エラーについて報告し、指定されている場合は入力ファイル情報を表示します。 例私は対話的なコマンドを実行:powershellとconsoleアプリの出力

D:\ video.Enc \ ffmpeg.exe -id:\ video.Enc \ 1.wmv

これはPowerShellのコンソール出力

ffmpeg.exe : FFmpeg version SVN-r20428, Copyright (c) 2000-2009 Fabrice Bellard, et al. 
row:1 char:24 
+ d:\video.Enc\ffmpeg.exe <<<< -i d:\video.Enc\1.wmv 
    + CategoryInfo   : NotSpecified: (FFmpeg version ...Bel 
    lard, et al.:String) [], RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 

    built on Nov 1 2009 04:03:50 with gcc 4.2.4 
    configuration: --enable-memalign-hack --prefix=/mingw --cross-pre 
fix=i686-mingw32- --cc=ccache-i686-mingw32-gcc --target-os=mingw32 
--arch=i686 --cpu=i686 --enable-avisynth --enable-gpl --enable-vers 
ion3 --enable-zlib --enable-bzlib --enable-libgsm --enable-libfaad 
--enable-pthreads --enable-libvorbis --enable-libtheora --enable-li 
bspeex --enable-libmp3lame --enable-libopenjpeg --enable-libxvid -- 
enable-libschroedinger --enable-libx264 --enable-libopencore_amrwb 
--enable-libopencore_amrnb 
    libavutil  50. 3. 0/50. 3. 0 
    libavcodec 52.37. 1/52.37. 1 
    libavformat 52.39. 2/52.39. 2 
    libavdevice 52. 2. 0/52. 2. 0 
    libswscale  0. 7. 1/0. 7. 1 
[wmv3 @ 0x144dc00]Extra data: 8 bits left, value: 0 

Seems stream 1 codec frame rate differs from container frame rate: 
1000.00 (1000/1) -> 15.00 (15/1) 
Input #0, asf, from 'd:\video.Enc\1.wmv': 
    Duration: 00:12:0 
2.00, start: 5.000000, bitrate: 197 kb/s 
    Stream #0.0(eng): Audio: wmav2, 44100 Hz, 1 channels, s16, 48 k 
b/s 
    Stream #0.1(eng): Video: wmv3, yuv420p, 1024x768, 137 kb/s, 15 tbr, 1k tbn, 1k tbc Metadata 
    title   : Silverlight 2.0 Hello World Application 
    author   : Sergey Pugachev 
    copyright  : 
    comment   : 
    WMFSDKVersion : 11.0.6001.7000 
    WMFSDKNeeded : 0.0.0.0000 
    IsVBR   : 1 
    ASFLeakyBucketPairs: 
    VBR Peak  : 715351 
    Buffer Average : 127036 
At least one output file must be specified 
です

しかし、私はどのようにこれをスクリプト化して、どんな種類のオブジェクトにも出力することはできません。 私は直接スクリプトを試しました、wher ps1ファイルには正確な表現 "d:\ video.Enc \ ffmpeg.exe -i d:\ video.Enc \ 1.wmv"が含まれています。また、私はinvoke-commandとinvoke式でそれをしようとしました。最初のものはコマンドで2番目の1つのダンプエラーを出力コンソールに返しますが、-ErrorVariableには指定しません(エラー1だけでなく、すべてが空です)。

誰でもコンソールアプリケーションをPOSHで起動して出力をキャプチャするための正しい構文を指すことはできますか?

2番目の質問は、その出力を解析することです。変換の正しいアスペクト比を計算するには、ビデオ解像度データが必要です。誰もが捕獲エラー出力で動作し、

のようなストリーム#0.1(ENG)の文字列を解析する方法を指すのであれば、それはクールになります:ビデオ:WMV3、YUV420P、1024×768

答えて

7

をリダイレクトしてくださいそのようstdoutにして、あなたは、単一の変数などにstdoutとstderrの両方をキャプチャすることができるはずエラーストリーム:

$res = d:\video.Enc\ffmpeg.exe -i d:\video.Enc\1.wmv 2>&1 

データをキャプチャするには、これを試してください

$res | Select-String '(?ims)^Stream.*?(\d{3,4}x\d{3,4})' -all | 
    %{$_.matches} | %{$_.Groups[1].Value} 

$ resが1つの文字列または複数の文字列になるかどうかはわかりませんが、どちらの場合でも上記はうまくいくはずです。

+0

stderrからstdoutまでは問題ありません。ありがとうございました。 stderrとstdoutを別々に入手する方法はありますか? データのキャプチャは少し異なります(オーディオとビデオの2つ以上のストリーム出力情報があります)、少なくとも「ストリーム」には逆参照または除外が必要ですが、この1点で自分自身を完成させることができます。あなたが私に与えた出発点に感謝します。 –

+0

ええ、別々にキャプチャすることができます - ffmpeg.exe ...> foo.txt 2> foo.err –

+0

:)私は完全にはっきりしませんでした:)データストリームを別々に取得する方法はありますか? Ex Invoke-ExpressionにはErrorVariableとOutVariablesを指定するためのキーがあります。そのような種類の構文を使用して、一時ファイルを使用せずに出力を取得する方法はありますか? –

関連する問題