Созданные пользователем композитные видеоролики с хроматическим ключом с помощью FFMPEG / AVCONV

5224
Jimmery

Я хочу создать систему, в которой пользователь может загрузить два видео на веб-сайт, одно из которых имеет синий экран на заднем плане, а веб-сайт использует AVCONV (или аналогичный) для создания сводного видео из двух с использованием техники Chroma Key ( он же синий скрининг).

Можно ли использовать AVCONV таким образом?

Согласно этому посту на SO статическое изображение может быть Chrome Keyed в фоновом режиме. Но можно ли сделать то же самое с видео?

Я также хотел бы знать, должны ли два видео быть одинаковой длины и формата, прежде чем они могут быть объединены? Есть ли какие-то другие технические соображения, на которые я должен обратить внимание, чтобы иметь возможность предложить такую ​​услугу?

Заранее спасибо.

2

3 ответа на вопрос

3
rectalogic

Вы можете сделать это с помощью MLT

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 

Воспроизводится фоновое видео и клип с зеленым экраном собаки в качестве второго трека, сложенного сверху. Он использует хроматический ключ (установлен на зеленый цвет с некоторой дисперсией), чтобы применить альфа к зеленым областям, позволяя прозрачному фону просвечивать. Они in=XXXпросто усекают какой-то ведущий мусор на используемых видеоклипах.

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.

Таким образом, технически не может быть сделано, но вы нашли отличную работу вокруг. Большое спасибо! Jimmery 11 лет назад 0
Рад помочь :) ... если вы используете этот метод, не могли бы вы опубликовать, как вы сделали это здесь, в качестве ответа, чтобы помочь другим людям? Я также был бы лично заинтересован. evilsoup 11 лет назад 0
Фильтры frei0r в ffmpeg могут это сделать, но я не уверен, что ffmpeg может поддерживать использование фильтров frei0r, которые используют два входа. Говоря о frei0r, я также не уверен, может ли ffmpeg поддерживать фильтры frei0r «mixer2» и «mixer3». LordNeckbeard 11 лет назад 1
@LordNeckbeard, это действительно хороший момент, я сейчас собираю новую версию ffmpeg с --enable-libfrei0r, протестирую фильтр bluescreen0r позже сегодня / завтра. evilsoup 11 лет назад 0
Я буду заинтересован в ваших результатах. LordNeckbeard 11 лет назад 0
@evilsoup Я ищу наложение на видео в реальном времени, но одновременно я хочу увидеть три видео в одном потоке, возможно ли это, если да, не могли бы вы помочь, предоставив код? Thirumalai murugan 11 лет назад 0
@Thirumalaimurugan Я бы порекомендовал задать этот вопрос в качестве отдельного вопроса (возможно, связать с ним, если вы считаете это актуальным), чтобы вы могли углубиться в детали, а другие люди взглянут на проблему. evilsoup 11 лет назад 0
@evilsoup http://superuser.com/questions/581386/avconv-overlay-for-live-video Я разместил новый вопрос, пожалуйста, посмотрите и верните меня обратно спасибо Thirumalai murugan 11 лет назад 0
0
Ravikant Tiwari

хроматический ключ доступен в ffmpeg с версии 3.0, перед этим вы можете использовать опцию colorkey

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 

для colorkey в ffmpeg v2.8 или выше

 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 

Оба из них работают на меня.

Похожие вопросы