Наложение двух видео на статическое изображение?

у меня есть два видео, которые я хотел бы объединить в одно видео, в котором оба видео будут сидеть поверх статического фонового изображения. (Подумайте что-нибудь вроде этой.) Мои требования, что я свободна, что он работает на 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 Описание. Вам не нужно понимать это полностью, но это поможет вам понять следующий пример.

пример

two videos over static image

использовать 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

см. Также