将多个视频合并为一个

Sta*_*ked 5 c++ video ffmpeg gstreamer

我有三个视频:

  • 用摄像机拍摄的演讲
  • 演讲中使用的计算机桌面捕获视频
  • 和白板的视频

我想创建一个最终视频,这三个组件占据屏幕的某个区域.

开源软件是否允许我这样做(mencoder,ffmpeg,virtualdub ..)?你推荐哪一个?

或者是否有一个C/C++ API可以让我以编程方式创建类似的东西?

编辑
将来会有多个录制的讲座.这意味着我需要通用/自动化解决方案.

我目前正在检查是否可以使用GStreamer编写应用程序来完成这项工作.对此有何评论?

解决了!
我成功地用GStreamer的视频混合器元素做到了这一点.我使用gst-launch语法创建管道,然后使用gst_parse_launch加载它.这是实现复杂管道的一种非常有效的方法.

这是一个管道,它接收两个传入的视频流和一个徽标图像,将它们混合成一个流并复制它,以便它同时显示并保存到磁盘.

  desktop. ! queue
           ! ffmpegcolorspace
           ! videoscale
           ! video/x-raw-yuv,width=640,height=480
           ! videobox right=-320
           ! ffmpegcolorspace
           ! vmix.sink_0
  webcam. ! queue
          ! ffmpegcolorspace
          ! videoscale
          ! video/x-raw-yuv,width=320,height=240
          ! vmix.sink_1
  logo. ! queue
        ! jpegdec
        ! ffmpegcolorspace
        ! videoscale
        ! video/x-raw-yuv,width=320,height=240
        ! vmix.sink_2
  vmix. ! t.
  t. ! queue
     ! ffmpegcolorspace
     ! ffenc_mpeg2video
     ! filesink location="recording.mpg"
  t. ! queue
     ! ffmpegcolorspace
     ! dshowvideosink
  videotestsrc name="desktop"
  videotestsrc name="webcam"
  multifilesrc name="logo" location="logo.jpg"
  videomixer name=vmix
             sink_0::xpos=0 sink_0::ypos=0 sink_0::zorder=0
             sink_1::xpos=640 sink_1::ypos=0 sink_1::zorder=1
             sink_2::xpos=640 sink_2::ypos=240 sink_2::zorder=2
  tee name="t"
Run Code Online (Sandbox Code Playgroud)

Stu*_*son 4

可以用ffmpeg来完成;我自己做过。也就是说,它在技术上很复杂。话虽 如此,这也是您可能使用的任何其他软件的核心本质。

该过程的工作原理如下:

  1. 将音频从源 1 解复用为原始 wav
    • 来自源 2 的音频解复用器
    • 来自源 3 的音频解复用器
    • 将视频从源 1 解复用至 MPEG1
    • 来自源 2 的解复用视频
    • 来自源 3 的解复用视频
    • 连接音频 1 + 音频 2 + 音频 3
    • 连接视频 1 + 视频 2 + 视频 3
    • 将音频 123 和视频 123 复用到目标中
    • 编码为目标格式

我认为让人们感到惊讶的是,您实际上可以连接两个原始 PCM wav 音频文件,并且结果是有效的。真正让人们感到惊讶的是,您可以对 MPEG1/h.261 视频执行同样的操作。

就像我说过的,我已经做到了。虽然有一些细节被遗漏了,但它绝对有效。我的程序是使用 ffmpeg 在 bash 脚本中完成的。虽然我从未使用过 ffmpeg C API,但我不明白为什么你不能使用它来做同样的事情。

如果您愿意的话,这是一个非常有教育意义的项目。如果您的目标只是为了一次性项目而将一些视频拼凑在一起,那么也许使用 GUI 工具是一个更好的主意。

  • 他不是在问如何合成视频,使所有三个视频同时显示在一个帧内吗?听起来这只是将视频连接起来,以便它们一个接一个地播放。 (2认同)