combinar / canalizar / encadenar comandos ffmpeg multilínea juntos

combinar / canalizar / encadenar comandos ffmpeg multilínea juntos

Saludos. Puedo convertir un archivo de video en un archivo gif animado de alta calidad ejecutando las siguientes dos líneas de comandos debajo, una tras otra.

ffmpeg -i test.mkv -vf palettegen palette.png
ffmpeg -i test.mkv -i palette.png -lavfi paletteuse animated.gif

¿Hay alguna forma de encadenar las dos líneas de comandos para que solo tenga que ejecutar una línea?

La razón por la que hago esto es que me gustaría usarwinffentonces necesito encadenar las dos líneas en una operación de línea ejecutable ffmpeg. Puedo convertir cualquier archivo de vídeo en un gif animado con winff editando el archivo xml para que se parezca a las líneas siguientes.

<GifAnimation>
    <label>Gif Animation Simple</label>
    <params>-f gif</params>
    <extension>gif</extension>
    <category>Gif Animation</category>
  </GifAnimation>

Pero, ¿qué modificación debo hacer en la <params>línea para encadenar las dos líneas siguientes en una operación de línea ejecutable ffmpeg?

ffmpeg -i test.mkv -vf palettegen palette.png
ffmpeg -i test.mkv -i palette.png -lavfi paletteuse animated.gif

It looks like it needs to:
1) generate the color palette from the video
2) save the color palette to a file
3) read the color palette back in
4) apply it to the gif animation file.

ACTUALIZACIÓN Pregunta gracias asopa malvadaayuda

Probé las respuestas que me dio Evilsoup, vea el comando a continuación:

ffmpeg -i test.mkv -filter_complex 'palettegen[PAL],[0:v][PAL]paletteuse' output.gif

y

ffmpeg -i test.mkv -filter_complex 'palettegen,[v]paletteuse' output.gif

Crea un archivo gif animado pero solo tiene una imagen en el primer fotograma, todos los demás fotogramas están en blanco/casi se parece a todos los fotogramas, pero el primero tiene canales alfa. ver imagen gif adjunta.

Una imagen está solo en el primer cuadro, todos los demás cuadros tienen algún tipo de canal alfa. Debería ser una imagen de un objeto que gira de manera inclemente.

Recibo errores cuando ejecuto el comando que se muestra a continuación, lo que podría ser la razón por la que ¿tiene alguna idea de cómo solucionar este problema?

[Parsed_paletteuse_1 @ 0xd526c0] [framesync @ 0xec5108] Buffer queue overflow, dropping.
    Last message repeated 82 times
[Parsed_paletteuse_1 @ 0xd526c0] [framesync @ 0xec5108] Buffer queue overflow, dropping.
    Last message repeated 36 times

Vea la lista completa a continuación:

rt@sys76:/tmp$ ffmpeg -i test.mkv -filter_complex 'palettegen[PAL],[0:v][PAL]paletteuse' output.gif
ffmpeg version 2.8.6-1ubuntu2 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.3.1 (Ubuntu 5.3.1-11ubuntu1) 20160311
  configuration: --prefix=/usr --extra-version=1ubuntu2 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
  WARNING: library configuration mismatch
  avcodec     configuration: --prefix=/usr --extra-version=1ubuntu2 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv --enable-version3 --disable-doc --disable-programs --disable-avdevice --disable-avfilter --disable-avformat --disable-avresample --disable-postproc --disable-swscale --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libvo_aacenc --enable-libvo_amrwbenc
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, matroska,webm, from 'test.mkv':
  Metadata:
    ENCODER         : Lavf56.40.101
  Duration: 00:00:07.40, start: 0.000000, bitrate: 125 kb/s
    Stream #0:0: Video: h264 (High), yuv420p, 560x480, SAR 1:1 DAR 7:6, 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
    Metadata:
      ENCODER         : Lavc56.60.100 libx264
      DURATION        : 00:00:07.400000000
File 'output.gif' already exists. Overwrite ? [y/N] y
Output #0, gif, to 'output.gif':
  Metadata:
    encoder         : Lavf56.40.101
    Stream #0:0: Video: gif, pal8, 560x480 [SAR 1:1 DAR 7:6], q=2-31, 200 kb/s, 25 fps, 100 tbn, 25 tbc (default)
    Metadata:
      encoder         : Lavc56.60.100 gif
Stream mapping:
  Stream #0:0 (h264) -> palettegen
  Stream #0:0 (h264) -> paletteuse:default
  paletteuse -> Stream #0:0 (gif)
Press [q] to stop, [?] for help
[Parsed_paletteuse_1 @ 0xd526c0] [framesync @ 0xec5108] Buffer queue overflow, dropping.
    Last message repeated 82 times
[Parsed_paletteuse_1 @ 0xd526c0] [framesync @ 0xec5108] Buffer queue overflow, dropping.
    Last message repeated 36 times
[Parsed_palettegen_0 @ 0xd52220] 255(+1) colors generated out of 201259 colors; ratio=0.001267
frame=   65 fps= 47 q=-0.0 Lsize=     130kB time=00:00:07.40 bitrate= 143.5kbits/s    
video:128kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.005128%
rt@sys76:/tmp$

Respuesta1

Necesita utilizar una cadena de filtros (consulte laFFmpegwikiyen línea documentación).

ffmpeg -i input.mkv -filter_complex 'palettegen[PAL],[0:v][PAL]paletteuse' output.gif

Básicamente, el palettegenfiltro toma una sola entrada de video (por lo que, siempre que no tenga más de una transmisión de video entre sus entradas, no necesita especificar dónde está la entrada) y proporciona una salida de video (bueno, imagen). ; mientras tanto,paletteuse tomadosEntradas de vídeo (bueno, un vídeo y una imagen).

Normalmente, en una cadena de filtros, la primera salida de cada filtro se convierte en la primera entrada del siguiente en la cadena. Sin embargo, el paletteusefiltro espera que el video sea su primera entrada, con la 'paleta' como su segunda entrada; esta es una de las razones por las que no puede usar simplemente palettegen,paletteuse. El[0:v] usos de FFmpegselección de flujosintaxis (mira aquípara ver algunos ejemplos de su uso) para indicarle paletteuseque tome video del primer archivo de entrada (FFmpeg comienza a contar desde 0 para la mayoría de las cosas) como su primera entrada.

Técnicamente podrías escribir lo anterior así:

ffmpeg -i input.mkv -filter_complex 'palettegen,[v]paletteuse' output.gif

...y funcionaría igual de bien (suponiendo que solo haya una transmisión de video entre las entradas). Pero creo que etiquetar el palettegenresultado y decirle explícitamente adónde ir hace que las cosas sean un poco más claras de seguir.

Nunca he usado WinFF, pero parece que solo necesitas poner todas las opciones de FFmpeg entre las etiquetas. Entonces, esto debería funcionar:

<GifAnimation>
    <label>Gif Animation Simple</label>
    <params>-filter_complex 'palettegen[PAL],[0:v][PAL]paletteuse'</params>
    <extension>gif</extension>
    <category>Gif Animation</category>
  </GifAnimation>

Respuesta2

Solo quería agregar el código que funcionó en caso de que alguien más lo necesite.

Esta es la línea final que funcionó. Todo el agradecimiento a evilsoup y Mulvya.

ffmpeg -i test.mkv -filter_complex 'palettegen[PAL];[0:v]fifo[v0];[v0][PAL]paletteuse' test.gif

Además, si desea que winff funcione con gifs animados, simplemente agregue estas líneas al presets.xmlarchivo winff.

<GifAnimationSimple>
    <label>Gif Animation Simple</label>
    <params>-f gif</params>
    <extension>gif</extension>
    <category>Gif Animation</category>
  </GifAnimationSimple>

  <GifAnimationbitrate>
    <label>Gif Animation bitrate Quality</label>
    <params>-f -b 2048k gif</params>
    <extension>gif</extension>
    <category>Gif Animation</category>
  </GifAnimationbitrate>

  <GifAnimationHigh>
    <label>Gif Animation high Quality paletteuse</label>
    <params>-filter_complex 'palettegen[PAL];[0:v]fifo[v0];[v0][PAL]paletteuse' </params>
    <extension>gif</extension>
    <category>Gif Animation</category>
  </GifAnimationHigh>

información relacionada