Наложение двух видео на статическое изображение?
у меня есть два видео, которые я хотел бы объединить в одно видео, в котором оба видео будут сидеть поверх статического фонового изображения. (Подумайте что-нибудь вроде этой.) Мои требования, что я свободна, что он работает на OSX, и что мне не придется перекодировать мое видео чрезмерное количество раз. Я также хотел бы иметь возможность выполнять эту операцию из командной строки или через скрипт, так как я буду делать это много. (Но это не строго необходимый.)
Я пробовал возиться с ffmpeg в течение нескольких часов, но он просто не очень хорошо подходит для пост-обработки. Я мог бы потенциально взломать что-то вместе с помощью функции наложения, но до сих пор я не понял, как это сделать, кроме мучительного преобразования изображения в видео (что занимает 2x столько, сколько длина моих видео!), а затем наложение двух видео на него на другом шаге рендеринга.
какие-либо советы? Благодарить ты!
обновление:
благодаря помощи LordNeckbeard, я смог достичь желаемого результата с помощью одного вызова ffmpeg! К сожалению, кодирование довольно медленное, занимает 6 секунд для кодирования 1 секунды видео. Я считаю, что это вызвано фоновым изображением. Есть советы по ускорению кодирования? Вот его лог:
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
обновление 2:
это работает! Одним из важных настроек было перемещение подкладывать.ввод png в конец списка ввода. Это значительно повысило производительность. Вот мой последний звонок ffmpeg. (Карты в конце не требуются для этого конкретного расположения, но иногда у меня есть несколько дополнительных аудиовходов, которые я хочу сопоставить с моим выходом.)
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
1 ответов
сложные фильтрографы в ffmpeg могут показаться сложными сначала, но это имеет смысл, как только вы попробуете это несколько раз. Вы должны быть знакомы с синтаксисом filtergraph. Начните с чтения Фильтрация Введение и Filtergraph Описание. Вам не нужно понимать это полностью, но это поможет вам понять следующий пример.
пример
использовать scale
видео фильтр для масштабирования (изменения размера) входных данных до определенного размера, а затем используйте overlay
видео фильтр для размещения видео над статическими изображениями.
ffmpeg -loop 1 -i background.png -i video1.mp4 -i video2.mp4 -filter_complex \
"[1:v]scale=(iw/2)-20:-1[a]; \
[2:v]scale=(iw/2)-20:-1[b]; \
[0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]; \
[c][b]overlay=main_w-overlay_w-10:(main_h/2)-(overlay_h/2)[video]" \
-map "[video]" output.mkv
что это значит
не параметры фильтрации:
-loop 1
непрерывный цикл следующий вход, который составляетbackground.png
.background.png
фоновый рисунок. The описатель потока и[0:v]
это размер 1280х720.video1.mp4
это первый видеовход (Big Buck Bunny в примере изображения). Спецификатор потока[1:v]
. Это размер 640х360.video2.mp4
этот второй видеовход (varmints в примере изображения). Спецификатор потока[2:v]
. Это размер 640х360.
параметры фильтрации
-filter_complex
запуск комплекса filtergraph.[1:v]scale=(iw/2)-20:-1[a]
этоvideo1.mp4
, называют[1:v]
, и его масштабирование.iw
псевдоним ширина входного сигнала, и в этом случае это значение равно 640. Мы делим, чем пополам, и вычитаем дополнительные 20 пикселей в качестве заполнения, чтобы вокруг каждого видео было пространство, когда оно накладывается.-1
означает автоматическое вычисление значения, которое сохранит аспект. Если, конечно, вы можете опустить крутостью и вручную указать значения такие какscale=320:240
. Затем используйте выход метка имени[a]
поэтому мы можем обратиться к этому выводу позже.[2:v]scale=(iw/2)-20:-1[b]
то же, что и выше, но используйтеvideo2.mp4
в качестве входа и назовите метку выходного канала как[b]
.[0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]
использоватьbackground.png
в качестве первого ввода наложения и используйте результаты нашего первого фильтра шкалы, называемого[a]
, как второй входной сигнал наложения. Место[a]
над[0:v]
.main_h
- это псевдоним для главная высота который относится к фоновому входу ([0:v]
) высота.overlay_h
псевдоним оверлея высота и относится к высоте изображения ([a]
). Этот пример поместит Big Buck Bunny с левой стороны.shortest=1
заставит выход завершиться, когда закончится самый короткий вход; в противном случае он будет петля навсегда сbackground.png
- это зацикливание. Назовите результаты этого фильтра[c]
.[c][b]overlay=overlay_w*2:overlay_h:shortest=1[video]
использовать[c]
в качестве первого входного оверлея и[b]
как второй вход наложения. Использование параметров наложенияoverlay_w
иoverlay_h
(ширина и высота входного сигнала верхнего слоя). В этом примере будет этого сброда verminy на правой стороне. Обозначьте вывод как[video]
.-map "[video]"
сопоставьте выходные данные фильтра с выходным файлом. The[video]
метка ссылки в конце filtergraph не обязательно требуется, но рекомендуется быть явным с отображение.
аудио
есть два отдельных звуковых потоков
по умолчанию на выходе будет использоваться только первый встреченный входной аудиоканал, как определено в Выбор Потока. Вы можете использовать -map
возможность добавления дополнительной звуковой дорожки со второго видеовхода (на выходе будет два аудиопотока). Этот пример трансляция копия аудио вместо повторное кодирование:
ffmpeg -loop 1 -i background.png -i video1.mp4 -i video2.mp4 -filter_complex \
"[1:v]scale=(iw/2)-20:-1[a]; \
[2:v]scale=(iw/2)-20:-1[b]; \
[0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]; \
[c][b]overlay=main_w-overlay_w-10:(main_h/2)-(overlay_h/2)[video]" \
-map "[video]" -map 1:a -map 2:a -codec:a copy output.mkv
объединить оба аудиопотока
или объединить оба аудиовхода в один с помощью amerge
и pan
аудио фильтры (при условии, что оба входа стерео, и вы хотите стерео выход):
ffmpeg -loop 1 -i background.png -i video1.mp4 -i video2.mp4 -filter_complex \
"[1:v]scale=(iw/2)-20:-1[a]; \
[2:v]scale=(iw/2)-20:-1[b]; \
[0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]; \
[c][b]overlay=main_w-overlay_w-10:(main_h/2)-(overlay_h/2)[video]" \
[1:a][2:a]amerge,pan=stereo:c0<c0+c2:c1<c1+c3[audio]" \
-map "[video]" -map "[audio]" output.mkv