Question Insérer une image de fond en utilisant FFmpeg


Je viens de commencer à utiliser FFMpeg et j'essaie de créer un diaporama vidéo à partir d'images avec une image d'arrière-plan. L'arrière-plan ne changerait que l'image.

Similaire à ceci:

enter image description here

J'ai le suivant

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

Et cela fonctionne parfaitement pour créer un diaporama avec les images mais lorsque j'essaie d'ajouter une image d'arrière-plan pour chaque image en utilisant la commande suivante (superposition).

"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"

Ceci est mon journal des erreurs:

    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

Mise à jour de la réponse:

<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>

4
2018-02-10 19:58


origine


Vous manquez un backslash après le -vf ligne. C'est pourquoi ffmpeg vous dit qu'il y a des options de fin (-vf) et aucun fichier de sortie. Mais même dans ce cas, cela ne fonctionnerait pas, car vous avez besoin d'un graphe de filtrage complexe, et vous devez positionner correctement la superposition. - slhck


Réponses:


Diaporama avec fond d'image statique

pug life

Vous n'avez pas besoin d'utiliser le movie filtre source et utilisation -filter_complex au lieu de -vf.

ffmpeg \
-loop 1 \
-framerate 1 \
-i bg.jpg \
-framerate 1/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 assurera un "format de pixel" ou un schéma de sous-échantillonnage de chrominance largement compatible, qu'il est utile d'ajouter libx264.

  • -movflags +faststart relocalisera certaines données une fois l'encodage terminé, ce qui permettra aux utilisateurs de commencer la lecture avant que le fichier ne soit complètement téléchargé. Utile par exemple si vous hébergez vous-même et le mettez sur un site Web.

Avec audio

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

Avec du texte

Le texte peut être ajouté avec le drawtext filtre.

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

Voir le drawtext documentation du filtre pour beaucoup plus d'options.

Avec une bordure

le drawbox filtre peut être utilisé pour dessiner une bordure blanche autour de l'image superposée. Notez que j'ai commencé à nommer les entrées et sorties de chaque filtre, puis j'ai référencé les résultats du filtre final avec -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

Regarde aussi


5
2018-02-10 20:13



Merci beaucoup pour la bonne réponse. J'ai mis à jour ma question avec la réponse que vous m'avez donnée mais quand je lance la commande, elle ne s'arrête jamais et la taille du fichier ne fait que grossir. Je dois tuer le processus. Pouvez-vous vérifier si j'ai fait une erreur (voir Mise à jour de la réponse). - Yannick
@Yannick Cela fonctionne-t-il comme prévu si vous exécutez ffmpeg manuellement via la ligne de commande? - LordNeckbeard
Oui @LordNeckbeard comme vous pouvez le voir screencast.com/t/LYqd0KNoMjX - Yannick
@Yannick. J'ai oublié d'utiliser le shortest=1 option en superposition. Ceci est nécessaire parce que je vous ai fait boucler votre image de fond, et par défaut ne pas se termine lorsque la plus courte entrée se termine. La réponse a été mise à jour. - LordNeckbeard
@NineCattoRules Vous devez pointer fontfile option à un fichier de police disponible sur votre ordinateur. Vous devrez peut-être utiliser le chemin complet, tel que /usr/share/fonts/TTF/DejaVuSans.ttf. - LordNeckbeard