将多个视频合并为一个

时间:2009-11-10 17:10:29

标签: 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"

4 个答案:

答案 0 :(得分:4)

可以用ffmpeg完成;我自己做了。也就是说,技术上很复杂。也就是说,再次,这是你可能使用的任何其他软件将在其核心本质中做的事情。

这个过程是这样的:

  1. 从源1到原始wav的Demux音频
    • 来自源2的Demux音频
    • 来自源3的Demux音频
    • 从源1到MPEG1的Demux视频
    • 来自源2的Demux视频
    • 来自源3的Demux视频
    • 连接音频1 +音频2 +音频3
    • 连接视频1 +视频2 +视频3
    • Mux audio 123和video 123 into target
    • 编码为目标格式
  2. 我认为令人惊讶的是,你可以逐字地连接两个原始的PCM wav音频文件,结果是有效的。人们真正感到惊讶的是,你可以用MPEG1 / h.261视频做同样的事情。

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

    如果你愿意的话,这是一个非常有教育意义的项目。如果您的目标只是为了一次性项目拍摄一些视频,那么使用GUI工具可能是一个更好的主意。

答案 1 :(得分:2)

如果您只想将素材组合成一个视频并裁剪视频,我会使用虚拟配音。

答案 2 :(得分:2)

您可以使用VLC将多个视频文件/流组合成一张图片:

有一个命令行界面,因此您可以编写脚本/自动化它。

http://wiki.videolan.org/Mosaic

答案 3 :(得分:-1)

avisynth可以轻松完成。在Mosaic部分下查看here以获取示例。

我已经使用过ffmpeg了,我从来没有偶然发现这个功能,但这并不意味着它不存在。如果你正在寻找一个项目,你总是可以使用libavformat和libavcodec(ffmpeg库)在C或C ++中自己完成,但是你必须自己动手合成视频。如果您只想完成视频而不是修补代码,请务必使用avisynth或virtualdub等预制工具。