Inserir imagem de fundo usando o FFmpeg

4

Acabei de começar a usar o FFMpeg e estou tentando criar uma apresentação de slides de vídeo a partir de imagens com uma imagem de plano de fundo. O fundo não mudaria apenas a imagem.

Semelhante a isto:

Eutenhooseguinte

"ffmpeg -framerate 1/5 \
-start_number 1 \
-i "C:/test/%03d.jpg" \
-c:v libx264 \
-r 30 "C:/test/video.mp4"

E isso funciona perfeitamente para criar slideshow com as imagens, mas quando tento adicionar uma imagem de fundo para cada foto usando o seguinte comando (sobreposição).

"ffmpeg -framerate 1/5 \
-start_number 1 \
-i "C:/test/%03d.jpg" \
-vf 'movie=C:/test/bg.jpg [over], [in][over] overlay'
-c:v libx264 \
-r 30 "C:/test/video.mp4"

Este é o meu log de erros:

    ffmpeg version N-69587-g15a8846 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.9.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-

    bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib
      libavutil      54. 18.100 / 54. 18.100
      libavcodec     56. 21.102 / 56. 21.102
      libavformat    56. 19.100 / 56. 19.100
      libavdevice    56.  4.100 / 56.  4.100
      libavfilter     5.  9.103 /  5.  9.103
      libswscale      3.  1.101 /  3.  1.101
      libswresample   1.  1.100 /  1.  1.100
      libpostproc    53.  3.100 / 53.  3.100
    Trailing options were found on the commandline.
    Input #0, image2, from 'C:/test/%03d.jpg':
      Duration: 00:00:15.00, start: 0.000000, bitrate: N/A
        Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 768x1024 [SAR 1:1 DAR 3:4], 0.20 fps, 0.20 tbr, 0.20 tbn, 0.20 tbc
    At least one output file must be specified

Atualize a partir da resposta:

<cfscript>
    try {
        runtime = createObject("java", "java.lang.Runtime").getRuntime();
        command = '#ffmpegPath#' &
        ' -loop 1' &
        ' -framerate 1' &
        ' -i "C:/test/bg.jpg"' & 
        ' -framerate 1/5 -start_number 1' &
        ' -i "C:/test/%03d.jpg"' & 
        ' -filter_complex "overlay=(W-w)/2:(H-h)/2,format=yuv420p"' &
        ' -c:v libx264' &
        ' -r 30' &
        ' -movflags +faststart' &
        ' -shortest' &
        ' "C:/test/out.mp4"'; 
        process = runtime.exec(#command#);
        results.errorLogSuccess = processStream(process.getErrorStream(), errorLog);
        results.resultLogSuccess = processStream(process.getInputStream(), resultLog);
        results.exitCode = process.waitFor();
    }
    catch(exception e) {
        results.status = e;    
    }
</cfscript>
    
por Yannick 10.02.2015 / 20:58

1 resposta

5

Apresentação de slides com fundo de imagem estática

Vocênãoprecisausarofiltromoviesourceeusar-filter_complexemvezde-vf.

ffmpeg\-loop1\-framerate1\-ibg.jpg\-framerate1/5\-i"C:/test/%03d.jpg" \
-filter_complex "overlay=(W-w)/2:(H-h)/2:shortest=1,format=yuv420p" \
-c:v libx264 \
-r 30 \
-movflags +faststart \
output.mp4
  • format=yuv420p garantirá um esquema de subamostragem de cromatismo ou "formato de pixel" amplamente compatível, que é útil para adicionar ao usar libx264 .

  • -movflags +faststart realocará alguns dados após o término da codificação, o que permitirá que os espectadores iniciem a reprodução antes do download completo do arquivo. Útil, por exemplo, se você estiver hospedando por conta própria e colocando-o em um site.

com áudio

ffmpeg \
-loop 1 \
-framerate 1 \
-i bg.jpg \
-framerate 1/5 \
-i "C:/test/%03d.jpg" \
-i audio.mp3 \
-filter_complex "overlay=(W-w)/2:(H-h)/2:shortest=1,format=yuv420p" \
-c:v libx264 \
-r 30 \
-c:a aac -strict experimental \
-b:a 192k \
-movflags +faststart \
-shortest
output.mp4

Com texto

O texto pode ser adicionado com o filtro drawtext .

ffmpeg \
-loop 1 \
-framerate 1 \
-i bg.jpg \
-framerate 1/5 \
-i "C:/test/%03d.jpg" \
-i audio.mp3 \
-filter_complex "overlay=(W-w)/2:(H-h)/2:shortest=1,drawtext=fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=(w-text_w)/2:y=10,format=yuv420p" \
-c:v libx264 \
-r 30 \
-c:a aac -strict experimental \
-b:a 192k \
-movflags +faststart \
-shortest \
output.mp4

Veja a % documentação do filtrodrawtext para muitas outras opções.

Com uma borda

O drawbox filter pode ser usado para desenhar uma borda branca ao redor da imagem sobreposta. Observe que comecei a nomear as entradas e saídas de cada filtro, depois referenciei os resultados finais do filtro com -map .

ffmpeg \
-loop 1 \
-framerate 1 \
-i bg.jpg \
-framerate 1/5 \
-i "C:/test/%03d.jpg" \
-i audio.mp3 \
-filter_complex "[1:v]drawbox=t=5:c=white[fg];[0:v][fg]overlay=(W-w)/2:(H-h)/2:shortest=1,drawtext=fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=(w-text_w)/2:y=10,format=yuv420p[v]" \
-map "[v]"
-map 0:a
-c:v libx264 \
-r 30 \
-c:a aac -strict experimental \
-b:a 192k \
-movflags +faststart \
-shortest \
output.mp4

Veja também

por 10.02.2015 / 21:13

Tags