combinando / piping / encadeando comandos ffmpeg multilinha juntos

combinando / piping / encadeando comandos ffmpeg multilinha juntos

Saudações, posso converter um arquivo de vídeo em um arquivo gif animado de alta qualidade executando as duas linhas de comandos a seguir, uma após a outra.

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

Existe alguma maneira de encadear as duas linhas de comandos, então eu só tenho que executar uma linha?

A razão pela qual estou fazendo isso é que gostaria de usarwinffentão preciso encadear as duas linhas em uma operação de linha executável ffmpeg. Posso converter qualquer arquivo de vídeo em um gif animado com winff editando o arquivo xml para se parecer com as linhas abaixo.

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

Mas que alteração preciso fazer na <params>linha para encadear as duas linhas abaixo em uma operação de linha executável 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.

ATUALIZAÇÃO Pergunta graças asopa do malajuda

Eu tentei as respostas que o evilsoup me deu, veja o comando abaixo:

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

e

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

Ele cria um arquivo gif animado, mas só tem uma imagem no primeiro quadro, todos os outros quadros estão em branco / quase se parece com todos os quadros, mas o primeiro tem canais alfa. veja a imagem gif anexada.

Uma imagem está apenas no primeiro quadro, todos os outros quadros possuem algum tipo de canal alfa. Deve ser a imagem de um objeto em rotação inclemente

Recebo erros quando executo o comando, veja abaixo. Qual pode ser o motivo de alguma ideia de como consertar isso?

[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

Veja lista completa abaixo:

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$

Responder1

Você precisa usar uma cadeia de filtros (veja oWiki do FFmpegeon-line documentação).

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

Basicamente, o palettegenfiltro recebe uma única entrada de vídeo (desde que você não tenha mais de um fluxo de vídeo entre suas entradas, não é necessário especificar onde está a entrada) e fornece uma saída de vídeo (bem, imagem). ; enquanto isso, paletteuselevadoisentradas de vídeo (bem, um vídeo e uma imagem).

Normalmente, em uma cadeia de filtros, a primeira saída de cada filtro se torna a primeira entrada do próximo na cadeia. No entanto, o paletteusefiltro espera que o vídeo seja sua primeira entrada, com a 'paleta' como sua segunda entrada - isso é parte do motivo pelo qual você não pode simplesmente usar palettegen,paletteuse. O [0:v]usa FFmpeg'sseleção de fluxosintaxe (Veja aquipara alguns exemplos de seu uso) para solicitar paletteuseo vídeo do primeiro arquivo de entrada (o FFmpeg começa a contar a partir de 0 para a maioria das coisas) como sua primeira entrada.

Você poderia tecnicamente escrever o texto acima assim:

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

...e funcionaria tão bem (assumindo apenas um fluxo de vídeo entre as entradas). Mas acho que rotular a palettegensaída e dizer explicitamente para onde ir torna as coisas um pouco mais claras de seguir.

Nunca usei WinFF, mas parece que você só precisa colocar todas as opções do FFmpeg entre as tags? Então, isso deve 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>

Responder2

Eu só queria adicionar o código que funcionou caso alguém precise dele

Esta é a linha final que funcionou. Todos os agradecimentos vão para Evilsoup e Mulvya.

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

Além disso, se você quiser que o winff funcione com gifs animados, basta adicionar estas linhas ao presets.xmlarquivo 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>

informação relacionada