【问题标题】:How can I tile videos/create a video montage?如何平铺视频/创建视频蒙太奇?
【发布时间】:2010-10-09 05:01:43
【问题描述】:

我有四个视频,我想以 2x2 的方式平铺制作一个新视频。有没有一种方法可以让我轻松地做到这一点,最好是免费的并且在 Linux 下?我愿意编写适量的程序,也许是为了与一些库进行交互,但不愿意自己编写一个完整的视频处理程序。您可以假设输入和输出视频采用最方便的常用格式。

gm montage 命令的类似物(用于图像)会很棒。

【问题讨论】:

    标签: layout video montage


    【解决方案1】:

    以下 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
    

    首先,填充过滤器将第一个输入视频的大小加倍,将原始视频留在左上角。然后,串行覆盖过滤器将其他输入放在由填充过滤器添加的黑色填充上。

    如果视频的分辨率不同,则需要对命令进行一些修改。

    【讨论】:

    • 像魅力一样工作:如果 ffmpeg 不可用,D 也可以与 avconv 完美运行(相同的参数)
    【解决方案2】:

    我自己目前正在将 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
    

    【讨论】:

    • 看起来不错,但对我不起作用。但是,the other pipeline he linked to DID 可以工作,尽管正如声称的那样,它效率低下并且缺乏声音。这绝对比我迄今为止所得到的要好。谢谢!同时,我会尝试找出 Ray's 不起作用的原因。
    • 我发布了一个更简单的示例。如果您想要音频,那么您必须从要使用音频的视频中进行选择。然后,您需要为该视频使用命名的 decodebin 元素并将其连接到 audioconvert -> audioresample -> audiosink。如果您需要更多帮助,请随时提出。
    • 好的,效果很好!重新音频:我不太需要它,但是如果您有一种混合所有音频的方法,那就太好了。 Re Windows:正如我的问题所说,我在 Linux 上。我认为这就是为什么“dshowvideosink”对我不起作用的原因,但我只是将其更改为 filesink。
    • 无论如何,我认为这是最好的答案,因为它包含完整的说明,而不仅仅是指向原则上应该能够完成任务的语言的指针。感谢您的帮助!
    • 太棒了 :) 顺便说一句,您可以在 Linux 上使用 autovideosink 而不是 dshowvideosink。您可能还需要在文件接收器之前添加一个 muxer 元素以使播放速度正确。
    【解决方案3】:

    这听起来像是 AviSynth 旨在解决的问题。

    AviSynth 本质上是一种用于处理视频流的脚本语言。一个文本文件描述了您想要应用于一个或多个输入视频流的操作。文本文件被交给 AviSynth 引擎,该引擎提供一个虚拟的 .AVI 文件,在您获取源流时一次一帧地处理它们。

    将 AviSynth 与从虚拟 .AVI 文件读取并写入新文件以保存更改的单独工具相结合。

    【讨论】:

    • 感谢您的帮助。由于我必须选择一个答案来奖励赏金,所以我选择了说明最完整的答案。尽管如此,我希望你能得到一些支持。
    • 很遗憾您无法安装它。几年前我安装它时它刚刚工作。反正我就是这样记的;)
    【解决方案4】:

    一种可能的解决方案是使用多媒体标记语言SMIL 来描述视频蒙太奇的布局。这需要一个用于编写 SMIL 文档的文本编辑器和一个用于显示它的 SMIL 视频播放器(例如,Ambulant、Quicktime 或 Realplayer)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 2023-03-19
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2021-07-21
      相关资源
      最近更新 更多