叠加两个视频到静态图像?(Superimposing two videos onto a stati

2019-07-03 20:13发布

我有我想合并成一个单一的视频,其中两个视频会坐在一个静止的背景图像的顶部的两个视频。 (认为像这样 )。我的要求是,我使用的软件是免费的,它运行在OSX,而我不必重新编码我的影片的次数过多的。 我也希望能够通过命令行或通过脚本执行此操作,因为我会做了很多。 (但这不是绝对必要的。)

我试着用的ffmpeg了几个小时摆弄,但它只是似乎并不非常适合后期处理。 我可以通过叠加功能可能砍的东西在一起,但到目前为止,我还没有想出如何从图像疼痛stakingly转换为视频做到这一点,除了(这只要花费2倍为我的影片长度!)然后叠加在另一个渲染步骤两个视频到它。

有小费吗? 谢谢!


更新:

由于LordNeckbeard的帮助下,我能够实现我想要的结果有一个ffmpeg的来电! 不幸的是,编码是相当缓慢的,以6秒编码视频的1秒。 我相信这是由背景图片引起的。 关于加快编码任何提示? 这里的ffmpeg的日志:

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

Answer 1:

在复杂的ffmpeg可以filtergraphs起初看起来很复杂,但它是有道理的,一旦你尝试了几次。 你需要熟悉语法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的背景图像。 的流指定符是[0:v]它是1280×720尺寸。

  • video1.mp4该第一视频输入(大巴克兔子中的示例图像)。 流指定符是[1:v] 它的尺寸为640x360。

  • video2.mp4该第二视频输入(在本例中的图像varmints)。 流指定符是[2:v] 它的尺寸为640x360。

过滤选项

  • -filter_complex启动FilterGraph动态复杂的选项。

  • [1:v]scale=(iw/2)-20:-1[a]这是服用video1.mp4 ,称为[1:v]并进行缩放。 iw输入宽度的别名,并且在这种情况下,它是我们把比在半和减去额外的20个像素作为填充所以会有围绕每个视频空间时,它被覆盖的640的值。 -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] 这个例子将放置大巴克兔子左侧。 shortest=1将迫使输出当最短输入终止终止; 否则会永远循环下去,因为background.png是循环。 命名此过滤器的结果[c]

  • [c][b]overlay=overlay_w*2:overlay_h:shortest=1[video]使用[c]作为第一覆盖输入和[b]作为第二覆盖输入。 使用覆盖参数overlay_woverlay_h (覆盖输入宽度和高度)。 这个例子将放置verminy varmints右侧。 标签输出作为[video]

  • -map "[video]"映射从滤波器到输出文件的输出。 在[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

同时结合了音频流

或使用音频输入组合成一个amergepan音频过滤器(假设两个输入都是立体声,并且希望立体声输出):

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

另请参阅

  • FFmpeg的过滤文件
  • FFmpeg的维基:过滤指南
  • FFmpeg的维基:X264编码指南


文章来源: Superimposing two videos onto a static image?