Pregunta

Estoy tratando de automatizar la conversión de video con PowerShell y la herramienta FFMPEG. FFMPEG tiene una salida detallada sobre el video si se llama sin todos los parámetros de Nessesary. Por lo general, informa sobre el error y muestra la información del archivo de entrada si se especifica. Ex ejecuté interactivamente dicho comando:

D: video.enc ffmpeg.exe -id: video.enc 1.wmv

Esta es la salida de la consola 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

Pero no puedo imaginar cómo escribir esto y capturar la salida a cualquier tipo de objetos elegantes. Intenté script directo, donde el archivo PS1 contenía expresión exacta "d: video.enc ffmpeg.exe -id: video.enc 1.wmv" - no funcionó. También intenté hacer eso con Invoke-Command e Invoke Expression. Primero devuelve una cadena exacta con el comando, segundo: error de volcado a la consola de salida, pero no a -srorvariable, especifiqué (establecí todas las variables, no solo el error uno, todos ellos estaban vacíos).

¿Alguien puede señalar la sintaxis para invocar aplicaciones de consola en POSH y capturar la salida?

La segunda pregunta será sobre analizar esa salida: necesitaré datos de resolución de video para calcular la relación de aspecto correcta para la conversión. Por lo tanto, será genial si alguien señala cómo trabajar con salida de error capturada y cadena de analización como

Transmisión #0.1 (Eng): Video: WMV3, YUV420P, 1024x768,

¿Fue útil?

Solución

Intente redirigir la secuencia de errores a stdout así y luego debería poder capturar STDOUT y STDERR en una sola variable, por ejemplo:

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

Para capturar los datos, pruebe esto:

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

No estoy seguro de si $ res será una cadena o múltiple, pero lo anterior debería funcionar para ambos casos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top