Benutzergenerierte Chroma-Key-Composite-Videos mit FFMPEG / AVCONV

5323
Jimmery

Ich möchte ein System erstellen, bei dem ein Benutzer zwei Videos auf eine Website hochladen kann, von denen eines im Hintergrund einen blauen Bildschirm hat, und die Website verwendet AVCONV (oder ähnliches), um mithilfe der Chroma-Key- Technik ein zusammengesetztes Video zu erstellen ( aka blaues Screening).

Kann AVCONV auf diese Weise verwendet werden?

Laut diesem Post auf SO kann ein statisches Bild in den Hintergrund Chrome Keyed werden. Aber kann man das auch mit einem Video machen?

Ich möchte auch wissen, ob die beiden Videos die gleiche Länge und das gleiche Format haben müssen, bevor sie zusammengefügt werden können. Gibt es andere technische Überlegungen, die ich prüfen sollte, um einen solchen Service anbieten zu können?

Danke im Voraus.

2

3 Antworten auf die Frage

3
rectalogic

Sie können dies mit MLT tun

melt https://archive.org/download/IMB_SF_R35_C8/IMB_SF_R35_C8_512kb.mp4 in=400 \ -track https://archive.org/download/IMB_SF_R19_C9/IMB_SF_R19_C9_512kb.mp4 in=450 \ -filter chroma key=0x00ff0000 variance=0.45 \ -transition composite 

Dies spielt ein Hintergrundvideo und einen Green-Screen-Clip eines Hundes als zweiten Titel, der oben zusammengesetzt ist. Es verwendet einen Chroma-Key (grün eingestellt mit etwas Abweichung), um das Alpha auf die grünen Bereiche anzuwenden, sodass der zusammengesetzte Hintergrund durchscheinen kann. Sie in=XXXsind nur zum Abschneiden einiger führender Abfälle in den verwendeten Videoclips.

2
evilsoup

Neither AVconv nor FFmpeg can currently do this - it's the one major video processing task that they cannot do.

These tools can overlay an image or video with a transparent background over another video or image - which is what that SO question you linked to wanted. However, the video with the transparent background needs to be in a video format that supports transparency (most of them don't) - I'd use qtrle (Apple's Animation codec). But they cannot do the actual chroma-keying (turning a certain colour transparent).

You could probably use a workaround involving avconv and ImageMagick, but it would be rather CPU-intensive, and I don't know how good your results would be. You would need to:

  1. Turn the video you want to chroma-key into individual frames with avconv
  2. Use ImageMagick's convert (or mogrify) tool to do the chroma-keying on each individual frame
  3. Stitch the frames back together with avconv & place it over the background video

You may be able to simplify the process using pipes.

To extract the frames (produces files that look like 00001.png, 00002.png, etc):

avconv -i input.mp4 %05d.png 

To stitch them back together & put on top of your background video after you've run ImageMagick over them:

avconv -f image2 -r 25 -i %05d.png -i background.mp4 \ -filter_complex '[1:v][0:v]overlay[out]' \ -map [out] -c:v libx264 -crf 23 -preset veryfast output.mp4 

-r 25 gives you a frame rate of 25; if you want another frame rate, just use a different number. Make sure you use the same frame rate as the original input video. If you want to take the audio from your original input, use

avconv -f image2 -r 25 -i %05d.png -i background.mp4 -i input.mp4 \ -filter_complex '[1:v][0:v]overlay[out]' \ -map [out] -map 2:a -c:v libx264 -crf 23 -preset veryfast -c:a copy output.mp4 

Note that some versions of AVconv (like the version in the Ubuntu repos) don't have support for filtergraphs. If that's the case for you, upgrade to a newer version of avconv or ffmpeg.

As for stage 2... I'm actually not sure how to do it, but I know that ImageMagick can do chroma-keying. Here are a few links you may find useful:

http://www.imagemagick.org/Usage/photos/#chroma_key
http://www.imagemagick.org/discourse-server/viewtopic.php?t=14394
http://tech.natemurray.com/2007/12/convert-white-to-transparent.html

Due to differences in lighting etc between the samples people will give you, you'll have to use something to detect the exact shades of blue to get rid of. You'll probably have to leave that up to your users, perhaps using ffmpeg to create a thumbnail, and then using an eyedropper to choose the background colour.

Technisch kann also nichts getan werden, aber Sie haben eine hervorragende Arbeit gefunden. Vielen Dank! Jimmery vor 11 Jahren 0
Freut mich zu helfen :) ... Wenn Sie diese Methode verwenden, können Sie bitte hier posten, wie Sie es getan haben, um anderen Menschen zu helfen? Ich wäre auch persönlich interessiert. evilsoup vor 11 Jahren 0
Die frei0r-Filter in ffmpeg können dies zwar tun, aber ich bin mir nicht sicher, ob ffmpeg die Verwendung von frei0r-Filtern mit zwei Eingängen unterstützen kann. Apropos frei0r, ich bin mir auch nicht sicher, ob ffmpeg die frei0r-Filter "mixer2" und "mixer3" unterstützen kann. LordNeckbeard vor 11 Jahren 1
@LordNeckbeard das ist ein wirklich guter Punkt, ich kompiliere gerade eine neue Version von ffmpeg mit --enable-libfrei0r, werde den bluescreen0r-Filter später / morgen testen. evilsoup vor 11 Jahren 0
Ich werde an Ihren Ergebnissen interessiert sein. LordNeckbeard vor 11 Jahren 0
@evilsoup Ich suche nach der Überlagerung von Live-Videos. Zu einem Zeitpunkt möchte ich drei Live-Videos in einem einzigen Stream sehen. Ist dies möglich? Wenn ja, können Sie helfen, indem Sie den Code angeben? Thirumalai murugan vor 11 Jahren 0
@Thirumalaimurugan Ich würde empfehlen, diese Frage als separate Frage zu stellen (wenn Sie es für relevant halten, möglicherweise mit dieser zu verknüpfen), können Sie auf diese Weise detaillierter eingehen und die anderen Personen werden einen Blick auf das Problem werfen evilsoup vor 11 Jahren 0
@evilsoup http://superuser.com/questions/581386/avconv-overlay-for-live-video Ich habe die neue Frage gepostet. Bitte schauen Sie sich diese an und kehren Sie zurück, danke Thirumalai murugan vor 11 Jahren 0
0
Ravikant Tiwari

chroma key ist in ffmpeg ab Version 3.0 verfügbar, bevor Sie die colorkey-Option verwenden können

ffmpeg -f mpeg -i input.mp4 -i video.mp4 -shortest -filter_complex "[1:v]chromakey=0x70de77:0.1:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.mp4 

für colorkey in ffmpeg v2.8 oder höher

 ffmpeg -f mpeg -i input.mp4 -i video.mp4 -shortest -filter_complex "[1:v]colorkey=0x70de77:0.1:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.mp 

Beide arbeiten für mich.