我有四个视频,我想用2x2方式制作一个新视频。有没有办法可以轻松地做到这一点,最好是免费的,在Linux下?我愿意编程适量,可能是为了与某些图书馆互动,但不愿意自己写一个完整的视频处理程序。您可以假设输入和输出视频是最方便的任何常见格式。
gm montage命令的模拟(对于图像)会非常棒。
答案 0 :(得分:6)
以下ffmpeg命令将完全符合提问者的要求:
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 -filter_complex \
'[0:v]pad=iw*2:ih*2:0:0[int2];[int2][1:v]overlay=0:H/2[int3];[int3][2:v]overlay=W/2:0[int4];[int4][3:v]overlay=W/2:H/2[out]' \
-map [out] -c:v libx264 -crf 23 -preset veryfast output.mp4
首先,pad filter会将第一个输入视频的大小加倍,将原始视频保留在左上角。然后,串行覆盖滤波器将其他输入放在由填充滤波器添加的黑色填充上。
如果视频的分辨率不同,则该命令需要进行一些修改。
答案 1 :(得分:4)
这听起来像是AviSynth旨在解决的问题。
AviSynth本质上是一种用于处理视频流的脚本语言。文本文件描述了要应用于一个或多个输入视频流的操作。文本文件被传递给AviSynth引擎,该引擎提供虚拟.AVI文件,在您获取源文件时一次一帧地处理源流。
将AviSynth与一个单独的工具相结合,该工具从虚拟.AVI文件中读取并写入新文件以保存更改。
答案 2 :(得分:4)
我目前正在使用GStreamer进行类似项目(讲座捕获)。您可能正在寻找videomixer元素。请查看此示例:Video 4-way split screen gstreamer pipeline(脚本位于here)。
GStreamer在Windows上运行得非常好。如果您有兴趣,可以查看GStreamer WinBuilds。
实施例
这是一个在Windows上适用于我的基本脚本(它没有反斜杠,因为我使用来自C代码的gst_parse_launch调用来解析管道描述):
v0. ! queue
! decodebin
! ffmpegcolorspace
! videoscale
! video/x-raw-yuv,width=320,height=240
! videobox right=-320 bottom=-240
! ffmpegcolorspace
! vmix.sink_0
v1. ! queue
! decodebin
! ffmpegcolorspace
! videoscale
! video/x-raw-yuv,width=320,height=240
! videobox bottom=-240
! ffmpegcolorspace
! vmix.sink_1
v2. ! queue
! decodebin
! ffmpegcolorspace
! videoscale
! video/x-raw-yuv,width=320,height=240
! videobox right=-240
! ffmpegcolorspace
! vmix.sink_2
v3. ! queue
! decodebin
! ffmpegcolorspace
! videoscale
! video/x-raw-yuv,width=320,height=240
! ffmpegcolorspace
! vmix.sink_3
vmix. ! queue
! ffmpegcolorspace
! dshowvideosink
filesrc location="c:/test.mpg" name="v0"
filesrc location="c:/test.mpg" name="v1"
filesrc location="c:/test.mpg" name="v2"
filesrc location="c:/test.mpg" name="v3"
videomixer name=vmix
sink_0::xpos=0 sink_0::ypos=0 sink_0::zorder=0
sink_1::xpos=320 sink_1::ypos=0 sink_1::zorder=1
sink_2::xpos=0 sink_2::ypos=240 sink_2::zorder=2
sink_3::xpos=320 sink_3::ypos=240 sink_3::zorder=3
答案 3 :(得分:1)