вывод PowerShell и консольного приложения - PullRequest
6 голосов
/ 02 декабря 2009

Я пытаюсь автоматизировать преобразование видео с помощью powershell и ffmpeg. Ffmpeg имеет подробный вывод о видео, если вызывается без всех необходимых параметров. Обычно он сообщает об ошибке и отображает информацию о входном файле, если он указан. Например, я в интерактивном режиме выполнил такую ​​команду:

d: \ video.Enc \ ffmpeg.exe -i d: \ 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

Но я не могу понять, как это написать и записать вывод в любой вид шикарных объектов. Я пробовал прямой скрипт, где файл ps1 содержал точное выражение "d: \ video.Enc \ ffmpeg.exe -i d: \ video.Enc \ 1.wmv" - это не сработало. Также я попытался сделать это с помощью invoke-command и invoke expression. Первый возвращает точную строку с командой, второй - выводит ошибку на выходную консоль, но не в -ErrorVariable, которую я указал (я установил все переменные, а не только одну ошибку - все они были пусты).

Может ли кто-нибудь указать на правильный синтаксис для вызова консольных приложений в шикарном режиме и захвата вывода?

Второй вопрос будет касаться синтаксического анализа этого вывода - мне понадобятся данные о разрешении видео, чтобы вычислить правильное соотношение сторон для преобразования. Так что было бы здорово, если кто-нибудь укажет, как работать с выводом захваченной ошибки и разобрать строку вроде

Поток # 0.1 (англ): Видео: wmv3, yuv420p, 1024x768 ,

1 Ответ

7 голосов
/ 02 декабря 2009

Попробуйте перенаправить поток ошибок на стандартный вывод, и тогда вы сможете записать как стандартный вывод, так и стандартный вывод в одну переменную, например ::10000

$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 одна или несколько строк, но вышеприведенное должно работать в обоих случаях.

...