Наложение двух видео на статическое изображение? - программирование
Подтвердить что ты не робот

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

У меня есть два видео, которые я хотел бы объединить в одно видео, в котором оба видео будут сидеть поверх статического фонового изображения. (Подумайте, что-то вроде this.) Мои требования заключаются в том, что используемое мной программное обеспечение бесплатное, что оно работает на OSX, и что у меня нет для повторного кодирования моих видео слишком много раз. Я также хотел бы иметь возможность выполнить эту операцию из командной строки или через script, так как я буду делать это много. (Но это не является строго необходимым.)

Я пробовал fiddling с ffmpeg в течение нескольких часов, но он просто не очень хорошо подходит для последующей обработки. Я могу потенциально взломать что-то вместе с помощью функции оверлея, но до сих пор я не понял, как это сделать, кроме боли, превращающей изображение в видео (что занимает 2x до тех пор, пока длина моих видеороликов!) и затем накладывая на него два видео на другом этапе рендеринга.

Какие-нибудь советы? Спасибо!


Update:

Благодаря помощи LordNeckbeard, я смог достичь желаемого результата с помощью одного вызова ffmpeg! К сожалению, кодирование происходит довольно медленно, и занимает 6 секунд для кодирования 1 секунды видео. Я считаю, что это вызвано фоновым изображением. Любые советы по ускорению кодирования? Здесь ffmpeg log:

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:

Это работает! Одной из важных настроек было перемещение входа underlay.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
4b9b3361

Ответ 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 Фоновое изображение. Спецификатор [0:v] имеет размер 1280x720.

  • video1.mp4 Этот первый видеовход (Big Buck Bunny в примере изображения). Спецификатор потока [1:v]. Он имеет размер 640x360.

  • video2.mp4 Этот второй видеовход (varmints в примере изображения). Спецификатор потока [2:v]. Он имеет размер 640x360.

Параметры фильтрации

  • -filter_complex Возможность запуска сложной фильтрации.

  • [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 (ширина и высота ввода наложения). Этот пример поставит верминьи варминтов с правой стороны. Выделите вывод как [video].

  • -map "[video]" отобразить выходные данные фильтра в выходной файл. Метка ссылки [video] в конце filtergraph необязательно требуется, но рекомендуется явно указывать отображение.

Аудио

Имеют два отдельных аудиопотока

По умолчанию только первый входной аудиоканал, который будет обнаружен, будет использоваться на выходе, как определено в Stream Selection. Вы можете использовать параметр -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

Также см.