Saída do aplicativo PowerShell e Console
-
11-09-2019 - |
Pergunta
Estou tentando automatizar a conversão de vídeo com a ferramenta PowerShell e FFMPEG. O FFMPEG possui saída detalhada sobre vídeo se chamado sem todos os parâmetros não. Geralmente, ele relata sobre erro e exibir informações do arquivo de entrada, se especificado. Ex I Interativamente executei esse comando:
D: video.enc ffmpeg.exe -id: video.enc 1.wmv
Esta é a saída do console do 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
Mas não consigo descobrir como script e capturar a saída para qualquer tipo de objetos elegantes. Eu tentei script direto, onde o arquivo PS1 continha expressão exata "D: video.enc ffmpeg.exe -id: video.enc 1.wmv" - não funcionou. Também tentei fazer isso com o comando de invocar e invocar a expressão. Primeiro, retorna uma string exata com comando, segundo erro de despejo para o console de saída, mas não para -ErrorVariable I especifiquei (eu defini todas as variáveis, não apenas o erro um - todos estavam vazios).
Alguém pode apontar para corrigir a sintaxe para invocar aplicativos de console no elegante e capturar a saída?
A segunda pergunta será sobre a análise dessa saída - precisarei de dados de resolução de vídeo para calcular a proporção correta para conversão. Portanto, será legal se alguém apontar como trabalhar com a saída de erro capturada e a string de análise como
Stream #0.1 (Eng): Vídeo: WMV3, YUV420P, 1024x768,
Solução
Tente redirecionar o fluxo de erros para Stdout assim e você poderá capturar o stdout e o stderr em uma única variável, por exemplo:
$res = d:\video.Enc\ffmpeg.exe -i d:\video.Enc\1.wmv 2>&1
Para capturar os dados, tente o seguinte:
$res | Select-String '(?ims)^Stream.*?(\d{3,4}x\d{3,4})' -all |
%{$_.matches} | %{$_.Groups[1].Value}
Não tenho certeza se $ res ser uma string ou múltipla, mas o acima deve funcionar para os dois casos.