Superposer deux vidéos sur une image statique?
J'ai deux vidéos que j'aimerais combiner en une seule vidéo, dans lequel les deux vidéos se serait assis sur le dessus d'un arrière-plan statique de l'image. (Pensez à quelque chose comme cette.) Mes exigences sont que le logiciel que j'utilise est gratuit, qu'il fonctionne sur OSX, et que je n'ai pas ré-encoder mes vidéos d'un trop grand nombre de fois. Je tiens également à être en mesure d'effectuer cette opération à partir de la ligne de commande ou via un script, car je vais faire beaucoup. (Mais ce n'est pas strictement nécessaire.)
J'ai essayé de jongler avec ffmpeg pour un couple d'heures, mais il ne semble pas très bien adapté pour le post-traitement. Je pourrais potentiellement hack quelque chose ensemble via la fonction de superposition, mais jusqu'à présent, je n'ai pas trouvé comment faire, à part minutieusement la conversion de l'image pour une vidéo (qui prend 2x plus long que la longueur de mes vidéos!) et puis en superposant les deux vidéos sur elle, dans une autre étape de rendu.
Des conseils à donner? Merci!!!!
Mise à jour:
Grâce à LordNeckbeard de l'aide, j'ai pu obtenir mon résultat souhaité avec un seul ffmpeg appel! Malheureusement, le codage est assez lent, prenant 6 secondes pour encoder 1 seconde de la vidéo. Je crois que cela est causé par l'image d'arrière-plan. Des conseils sur l'accélération de l'encodage? Voici le ffmpeg journal:
MacBook-Pro:Video archagon$ ffmpeg -loop 1 -i underlay.png -i test-slide-video-short.flv -i test-speaker-video-short.flv -filter_complex "[1:0]scale=400:-1[a];[2:0]scale=320:-1[b];[0:0][a]overlay=0:0[c];[c][b]overlay=0:0" -shortest -t 5 -an output.mp4
ffmpeg version 1.0 Copyright (c) 2000-2012 the FFmpeg developers
built on Nov 14 2012 16:18:58 with Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libspeex --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64 --enable-yasm --enable-gpl --enable-postproc --enable-libx264 --enable-libxvid
libavutil 51. 73.101 /51. 73.101
libavcodec 54. 59.100 /54. 59.100
libavformat 54. 29.104 /54. 29.104
libavdevice 54. 2.101 /54. 2.101
libavfilter 3. 17.100 / 3. 17.100
libswscale 2. 1.101 / 2. 1.101
libswresample 0. 15.100 / 0. 15.100
libpostproc 52. 0.100 /52. 0.100
Input #0, image2, from 'underlay.png':
Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
Stream #0:0: Video: png, rgb24, 1024x768, 25 fps, 25 tbr, 25 tbn, 25 tbc
Input #1, flv, from 'test-slide-video-short.flv':
Metadata:
author :
copyright :
description :
keywords :
rating :
title :
presetname : Custom
videodevice : VGA2USB Pro V3U30343
videokeyframe_frequency: 5
canSeekToEnd : false
createdby : FMS 3.5
creationdate : Mon Aug 16 16:35:34 2010
encoder : Lavf54.29.104
Duration: 00:50:32.75, start: 0.000000, bitrate: 90 kb/s
Stream #1:0: Video: vp6f, yuv420p, 640x480, 153 kb/s, 8 tbr, 1k tbn, 1k tbc
Input #2, flv, from 'test-speaker-video-short.flv':
Metadata:
author :
copyright :
description :
keywords :
rating :
title :
presetname : Custom
videodevice : Microsoft DV Camera and VCR
videokeyframe_frequency: 5
audiodevice : Microsoft DV Camera and VCR
audiochannels : 1
audioinputvolume: 75
canSeekToEnd : false
createdby : FMS 3.5
creationdate : Mon Aug 16 16:35:34 2010
encoder : Lavf54.29.104
Duration: 00:50:38.05, start: 0.000000, bitrate: 238 kb/s
Stream #2:0: Video: vp6f, yuv420p, 320x240, 204 kb/s, 25 tbr, 1k tbn, 1k tbc
Stream #2:1: Audio: mp3, 22050 Hz, mono, s16, 32 kb/s
File 'output.mp4' already exists. Overwrite ? [y/N] y
using cpu capabilities: none!
[libx264 @ 0x7fa84c02f200] profile High, level 3.1
[libx264 @ 0x7fa84c02f200] 264 - core 119 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
Metadata:
encoder : Lavf54.29.104
Stream #0:0: Video: h264 ([33][0][0][0] /0x0021), yuv420p, 1024x768, q=-1--1, 25 tbn, 25 tbc
Stream mapping:
Stream #0:0 (png) -> overlay:main
Stream #1:0 (vp6f) -> scale
Stream #2:0 (vp6f) -> scale
overlay -> Stream #0:0 (libx264)
Press [q] to stop, [?] for help
Mise à jour 2:
Ça marche!!! Un important tweak a été de passer la sous-couche.png entrée à la fin de la liste d'entrée. Cette performance accrue sensiblement. Voici ma dernière ffmpeg appel. (Les cartes à la fin ne sont pas requis pour cet arrangement particulier, mais j'ai parfois un supplément de quelques entrées audio que je veux à la carte à ma sortie.)
ffmpeg
-i VideoOne.flv
-i VideoTwo.flv
-loop 1 -i Underlay.png
-filter_complex "[2:0] [0:0] overlay=20:main_h/2-overlay_h/2 [overlay];[overlay] [1:0] overlay=main_w-overlay_w-20:main_h/2-overlay_h/2 [output]"
-map [output]:v
-map 0:a
OutputVideo.m4v
source d'informationauteur Archagon
Vous devez vous connecter pour publier un commentaire.
Complexe filtergraphs dans ffmpeg peut paraître compliqué au premier abord, mais il est logique une fois que vous essayer à quelques reprises. Vous devez être familier avec le filtergraph de la syntaxe. Commencez par lire Filtrage Introduction et Filtergraph Description. Vous n'avez pas à le comprendre complètement, mais il vous aidera à comprendre l'exemple suivant.
Exemple
Utiliser le
échelle
filtre vidéo à l'échelle (redimensionner) les entrées à une taille spécifique, et ensuite utiliser lerevêtement
filtre vidéo de placer les vidéos sur les images statiques.Ce que cela signifie
Non les options de filtrage:
-loop 1
Boucle en continu de la prochaine entrée qui estbackground.png
.background.png
L'image d'arrière-plan. Le flux spécificateur est[0:v]
Il est de taille 1280 x 720.video1.mp4
Cette première vidéo d'entrée (Big Buck Bunny dans l'image d'exemple). Le flux spécifique est[1:v]
. Il est de taille 640 x 360.video2.mp4
Cette deuxième vidéo d'entrée (le varmints dans l'image d'exemple). Le flux spécifique est[2:v]
. Il est de taille 640 x 360.Options de filtrage
-filter_complex
L'option pour démarrer le complexe filtergraph.[1:v]scale=(iw/2)-20:-1[a]
C'est la prise devideo1.mp4
dénommé[1:v]
et le passage à l'échelle.iw
est un alias pour largeur d'entréeet dans ce cas, il est d'une valeur de 640. On divise que dans la moitié et soustraire un supplément de 20 pixels comme rembourrage donc il y aura de la place autour de chaque vidéo quand elle est placée.-1
moyens pour calculer automatiquement une valeur qui permettra de préserver l'aspect. Si bien sûr, vous pouvez omettre le fanciness et de fournir manuellement des valeurs telles que lascale=320:240
. Utiliser ensuite une sortie label de lien nommé[a]
si nous pouvons nous référer à cette sortie plus tard.[2:v]scale=(iw/2)-20:-1[b]
Même que ci-dessus, mais utiliservideo2.mp4
que l'entrée et le nom du lien de sortie label[b]
.[0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]
Utilisationbackground.png
comme première superposition d'entrée, et d'utiliser les résultats de notre première échelle de filtre, appelé[a]
comme la superposition deuxième entrée. Lieu[a]
sur[0:v]
.main_h
est un alias pour principal de hauteur qui se réfère à l'arrière-plan d'entrée ([0:v]
) de hauteur.overlay_h
est un alias pour superposition hauteur et se réfère à la hauteur de l'avant-plan ([a]
). Cet exemple place de Big Buck Bunny sur le côté gauche.shortest=1
force la sortie à la fin lorsque les plus brefs de saisie se termine, sinon il va boucler indéfiniment depuisbackground.png
est une boucle. Nom les résultats de ce filtre[c]
.[c][b]overlay=overlay_w*2:overlay_h:shortest=1[video]
Utilisation[c]
comme la première superposition d'entrée et de[b]
comme la superposition deuxième entrée. À l'aide de la superposition des paramètresoverlay_w
etoverlay_h
(superposition d'entrée de largeur et de hauteur). Cet exemple aura lieu le verminy varmints sur le côté droit. L'étiquette de la sortie comme[video]
.-map "[video]"
carte la sortie du filtre pour le fichier de sortie. Le[video]
label de lien à la fin de la filtergraph n'est pas forcément nécessaire, mais il est recommandé d'être explicite avec la cartographie.Audio
Avoir deux flux audio
Par défaut, seule la première entrée audio de canal rencontrées seront utilisés dans la sortie tel que défini dans Flux De Sélection. Vous pouvez utiliser le
-map
option pour ajouter une piste audio supplémentaire à partir de la deuxième entrée vidéo (à la sortie de deux flux audio). Cet exemple stream copy l'audio, au lieu de ré-encodage:Combiner les deux flux audio
Ou de combiner les deux entrées audio en un seul à l'aide de la
amerge
etpan
filtres audio (en supposant que les deux entrées stéréo et que vous souhaitez la sortie stéréo):Voir aussi