usando o ffmpeg concat em vídeos de apresentação de slides

2

Estou usando o ffmpeg para criar animações de lapso de tempo a partir de imagens estáticas. A primeira imagem é repetida para criar um cabeçalho. Os próximos passos são concatenar cabeçalho e intervalo de tempo para o vídeo final. O cabeçalho e o lapso de tempo são criados bem. Criar o vídeo final concatenado não fornece o resultado esperado.

ffmpeg versão 1.2.6-7 no kubuntu 14.

O cabeçalho

ffmpeg -framerate 16 -f image2 -i './Header/Sun_20150214_head_%02d.png' -vf "crop=1240:940:40:10" -vf drawtext="fontsize=100:fontcolor=yellow:fontfile=/usr/share/fonts/truetype/freefont/FreeSans.ttf:textfile=./scripts/header_text.txt:x=(w-text_w)/2:y=(h-text_h-line_h)/2" -c:v libx264 -pix_fmt yuv420p -crf 16 -y ./Video/sunspot_20150214_header.mp4

ffmpeg -i ./Video/sunspot_20150214_header.mp4 -vf fade=in:0:30 -crf 24 -y ./Video/sunspot_20150214_header_fade.mp4

Por si só, o cabeçalho é reproduzido corretamente e apresenta um bom efeito de desvanecimento.

Agora, para o lapso de tempo:

ffmpeg -r 12 -threads 0 -f image2 -pattern_type glob -i './npy2reg/Sun_20150214_*.png'  -c:v libx264 -crf 16 -vf "crop=1240:940:40:10" -y ./Video/sunspot_20150214_crf16_12fps.mp4

Por si só, o lapso de tempo funciona bem.

Tentou usar a concat usando um arquivo concat.txt com ponteiros para os dois arquivos de entrada. arquivo concat.txt:

file '/home/gottsch/sunspot_20150214/Video/sunspot_20150214_header_fade.mp4'
file '/home/gottsch/sunspot_20150214/Video/sunspot_20150214_crf16_12fps.mp4'

O cmd para o ffmpeg:

ffmpeg -f concat -i ./scripts/concat.txt -c copy -y  ./Video/sunspot_20150214_crf16_12fps_final.mp4

Isso fornece meu arquivo de saída sunspot_20150214_crf16_12fps_final.mp4 . Problema: O arquivo de saída mostra apenas o cabeçalho.

Eu li que o mecanismo de concatenação ffmpeg requer que os vídeos de entrada sejam do mesmo formato, o que acredito ser dado quando o ffmpeg os criou.

Sua ajuda é apreciada.

Obrigado Gert

ATUALIZAÇÃO:

Fui solicitado a fornecer a saída do console do seguinte cmd:

gottsch@ubuntu:~/sunspot_20150214$ ffmpeg -i './Header/Sun_20150214_head_%02d.png' -pattern_type glob -i './npy2reg/Sun_20150214_*.png'
ffmpeg version 1.2.6-7:1.2.6-1~trusty1 Copyright (c) 2000-2014 the FFmpeg developers
  built on Apr 26 2014 18:52:58 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
  configuration: --arch=amd64 --disable-stripping --enable-avresample --enable-pthreads --enable-runtime-cpudetect --extra-version='7:1.2.6-1~trusty1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-libcdio --enable-x11grab --enable-libx264 --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    53.  5.103 / 53.  5.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, image2, from './Header/Sun_20150214_head_%02d.png':
  Duration: 00:00:02.36, start: 0.000000, bitrate: N/A
Stream #0:0: Video: png, rgb24, 1280x960, 25 fps, 25 tbr, 25 tbn, 25 tbc
Input #1, image2, from './npy2reg/Sun_20150214_*.png':
  Duration: 00:00:01.76, start: 0.000000, bitrate: N/A
Stream #1:0: Video: png, rgb24, 1280x960, 25 fps, 25 tbr, 25 tbn, 25 tbc
At least one output file must be specified
gottsch@ubuntu:~/sunspot_20150214$ 

depois disso, parece correto processar ambas as partes em um cmd. Meu script de processamento de imagem cria os arquivos em formato enumerado, então a segunda parte pode ser escrita sem o glob com a notação%.

ffmpeg -i './Header/Sun_20150214_head_%02d.png' -i './npy2reg/Sun_20150214_%02d.png'

O erro de linha cmd sobre o arquivo de saída ausente não é problema. Minha preocupação é a série de filtros que planejei incorporar. (fade, texto, recorte). Existe um tutorial sobre sequenciamento adequado e controle de precedência dos filtros?

Eu também me preocupo com a compatibilidade mais ampla possível do mpeg criado, para que a maioria das combinações de dispositivos / os / browsers possa processá-lo.

Na minha tentativa anterior, recebi um feedback que falha no navegador do sistema operacional MAC com um erro de plug-in ausente.

Obrigado Gert

UPDATE2

Seguindo linhas, cada um produz apenas um vídeo do cabeçalho. Nenhum quadro do lapso de tempo é mostrado.

ffmpeg -i './Header/Sun_20150214_head_%02d.png' -i './npy2reg/Sun_20150214_%02d.png' -codec:v libx264 -pix_fmt yuv420p -crf 16 -y ./Video/sunspot_20150214_crf16_12fps_test.mp4

ffmpeg -i './Header/Sun_20150214_head_%02d.png' -pattern_type glob -i './npy2reg/Sun_20150214_*.png' -codec:v libx264 -pix_fmt yuv420p -crf 16 -y ./Video/sunspot_20150214_crf16_12fps_test.mp4

Melhor Gert

    
por Gert Gottschalk 17.02.2015 / 00:15

1 resposta

1

Pelo que vejo, seus vídeos têm taxas de quadros diferentes, 16fps e 12fps. Para concatenar vídeos e usar a concat demuxer , a única coisa que pode ser diferente para os vídeos concatenarem pode ser a taxa de bits, tudo o mais, resolução, fps, codec, formato de cor ... devem ser iguais .

Veja a seção Concatenação wiki do FFmpeg

Soluções possíveis

  • Equalize todos os parâmetros possíveis de seus vídeos (fps, tamanho, ...)
  • Componha seus vídeos no editor de vídeo da GUI, como kdenlive
  • O FFMpeg é bastante limitado para tarefas de edição, como descolorações e textos. Se você realmente quiser criar / compor vídeos programaticamente, pessoalmente, eu usaria um servidor de quadros como o avisynth , que fornece tudo o que você precisa por meio de < Filtros Internos ( ImageSource , FadeIn , Subtitle , ...). No entanto, só está disponível para o Windows. Existe uma porta Linux chamada avxsynth , embora eu nunca tenha tentado isso. O uso de um servidor de quadros oferece a possibilidade de visualizar o final resultar em um media player de sua escolha, super fácil mudança de parâmetros e codificação do resultado final de uma só vez.
  • Use o filtro ffmpegs concat : link . Eu tive sucesso misturado com esse.

Exemplo de script avisynth

Eu fiz um simples script avisynth sunspot.avs , que poderia ser um ponto de partida para você. Eu tentei isso no windows, mas em teoria, ele deveria funcionar com o avxsynth também ...

# Set the desired parameters for the output video
out_fps = 25
out_width = 800
out_height = 600

# Make a title clip
blank = BlankClip(length=out_fps * 3, width=out_width, height=out_height, fps=out_fps, color=$000000).KillAudio()
blank_subtitle = blank.Subtitle("Your Title", align=5, size=60, text_color=$ffff00)

# Load image sequence, assume 16 input fps 16, convert to output video's 25fps
# NOTE: since the input frame rates differs from the output frame rate, there will be interpolation going on... 
sunspot = ImageReader("Sun_20150214_%02d.png", 1, 62, 16).ChangeFPS(out_fps).ConvertToRGB32()
# Crop & Resize, pay attention not to distort the images to the ratios
sunspot_cropped = sunspot.Crop(8,2,-9,-4).LanczosResize(out_width, out_height)

# Concatenate the clips (which now have the same fps + format + color space)
blank_subtitle.FadeIn(out_fps * 1) ++ sunspot_cropped

Você pode visualizar o resultado com ffplay sunspot.avs e, se estiver satisfeito, convertê-lo em um arquivo mp4, por exemplo:

ffmpeg -i sunspot.avs -c:v libx264 -crf 19 -preset:v slower -pix_fmt yuv420p -c:a libfdk_aac sunspot.mp4
    
por 18.02.2015 / 16:53

Tags