Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将多个视频合并为一个_C++_Video_Ffmpeg_Gstreamer - Fatal编程技术网

C++ 将多个视频合并为一个

C++ 将多个视频合并为一个,c++,video,ffmpeg,gstreamer,C++,Video,Ffmpeg,Gstreamer,我有三个视频: 用摄像机拍摄的演讲 讲座中使用的电脑桌面截图的视频 还有白板的视频 我想创建一个最终视频,其中三个组件占据屏幕的某个区域 是否有开源软件允许我这样做(mencoder、ffmpeg、virtualdub…)?你推荐哪一种 或者是否有一个C/C++API可以让我以编程方式创建类似的东西 编辑将来将有多个录制的讲座。这意味着我需要一个通用/自动化的解决方案 我目前正在检查是否可以用GStreamer编写一个应用程序来完成这项工作。对此有何评论 解决了 我用GStreamer的视频

我有三个视频:

  • 用摄像机拍摄的演讲
  • 讲座中使用的电脑桌面截图的视频
  • 还有白板的视频
我想创建一个最终视频,其中三个组件占据屏幕的某个区域

是否有开源软件允许我这样做(mencoder、ffmpeg、virtualdub…)?你推荐哪一种

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

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

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

解决了
我用GStreamer的视频混合器元素成功地做到了这一点。我使用gst-launch语法创建一个管道,然后使用gst\u-parse\u-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"

如果您只想将视频片段合并到单个视频中并裁剪视频,我会使用虚拟配音。

可以很容易地完成。在马赛克部分下查看示例


我已经使用了很多ffmpeg,我从来没有偶然发现过这个功能,但这并不意味着它不存在。你可以一直用C或C++自己用LIB格式和LIVAVCODEC(FFMPEG库)来做,如果你正在寻找一个项目,但你必须自己动手弄脏你的手。如果您只是想完成视频,而不是修补代码,那么一定要使用预先制作的工具,如avisynth或virtualdub。

可以使用ffmpeg;我自己做的。这就是说,它在技术上是复杂的。也就是说,这是你可能使用的任何其他软件的核心本质

过程如下所示:

  • 将音频从源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工具可能是一个更好的主意。

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

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


    看来我以后会经常做这种事情,所以我真的很想深入研究一下。谢谢你的信息!他不是在问合成视频,以便在一帧内同时显示所有三个视频吗?听起来这只是把视频连接起来,让它们一个接一个地播放。嗯……事实上,我想你可能是对的。是的,我的回答是“只是”连接。事实上,我甚至用了两次“concatenate”这个词。或者你可以用AdobeAfterEffects在30秒内完成整个过程(当然价格比免费的稍高)