2009-12-01 59 views
6

我試圖使用powershell和ffmpeg工具自動化視頻轉換。 如果調用沒有所有nessesary參數,Ffmpeg具有關於視頻的詳細輸出。通常它會報告錯誤並顯示輸入文件信息(如果指定)。 例我交互執行這樣的命令:powershell和控制檯應用程序輸出

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 

但我不知道如何編寫腳本並將輸出捕獲到任何類型的posh對象。 我試過直接腳本,而ps1文件包含準確的表達式「d:\ video.Enc \ ffmpeg.exe -i d:\ video.Enc \ 1.wmv」 - 它沒有工作。另外我試圖用invoke-command和invoke表達來做到這一點。第一個返回一個確切的字符串與命令,第二個 - 轉儲錯誤輸出控制檯,但不是我指定的-ErrorVariable(我確實設置了所有的變量,不僅錯誤一 - 所有這些都是空的)。

任何人都可以指向正確的語法來調用posh中的控制檯應用程序並捕獲輸出嗎?

第二個問題是解析輸出 - 我需要視頻分辨率數據來計算轉換的正確高寬比。因此,這將是冷靜,如果有人點了如何使用捕獲錯誤輸出工作,並解析字符串如

流#0.1(ENG):視頻:WMV3,YUV420P,1024×768

回答

7

嘗試重定向錯誤流到stdout像這樣,然後你應該能夠捕捉到標準輸出和標準錯誤在一個單一的變量如:

$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是一個字符串還是多個字符,但上面這兩個字符都適用。

+0

Stderr以標準輸出正常工作。謝謝。 有什麼辦法分別獲得stderr和stdout嗎? 數據採集有點不同(有2個或多個分離的流輸出信息 - 音頻和視頻),至少需要反向引用或排除「流」,但這一點我可以完成自己。讚賞你給我的出發點。 – 2009-12-02 07:43:23

+0

是的,你可以分別捕獲它們 - ffmpeg.exe ...> foo.txt 2> foo.err – 2009-12-02 14:56:57

+0

:)我沒有完全清楚:)是否有任何posh方式來分別獲取數據流。 Ex Invoke-Expression具有用於指定ErrorVariable和OutVariables的鍵。有什麼方法可以使用這種語法來獲取輸出,而不是使用臨時文件? – 2009-12-02 16:13:36

相關問題