我可以使用Gstreamer API合并2个视频吗?

时间:2009-07-21 14:43:18

标签: video video-processing gstreamer

我想编写一个简单的Linux CLI应用程序,可以使用2个视频源(1个演示者讲话,1个幻灯片,没有音频)并合并它们。

我希望整个输出视频能够并排显示两个原创视频。如果做不到这一点,我的第二个最佳选择将是“画中画”风格的视频,主持人在角落里的一个小框架中。

从几个小时的研究开始,GStreamer似乎可能能够做到这一点。任何人都可以在我花更多时间尝试之前确认它吗?

如果不能,那么我可以使用其他API吗?

4 个答案:

答案 0 :(得分:12)

这是一个使用gst-launch的简单(工作)设置(在Ubuntu / Debian上安装 gstreamer-tools 包):

gst-launch v4l2src device = / dev / video1!视频! ffmpegcolorspace! video / x-raw-yuv,width = 640,height = 480!视频框边界-α= 0左= -640! videomixer name = mix! ffmpegcolorspace! xvimagesink v4l2src!视频! ffmpegcolorspace! video / x-raw-yuv,width = 640,height = 480!视频框右= -640!混合

这基本上使用视频4 linux 2读取两个视频,一个来自默认设备,另一个来自/ dev / video1。如果您的设置不同,您可能想要更改它。

第一部分(非粗体)负责从捕获设备读取视频,协商大小和颜色空间(视频!ffmpegcolorspace),强制使用特定的视频格式(video / x-raw-yuv,width = 640 ,height = 480),向左添加640个透明像素(从而将图片向右移动)并创建名为“mix”的视频混合器。最后,它再次自动协商色彩空间并使用XVideo窗口显示结果。

第二部分(粗体)读取第二个视频流(来自默认捕获设备,添加 device = / dev / videoX 以选择其他设备),然后执行相同的颜色空间,大小对第一个流进行协商和视频格式选择,然后将视频向左移动640个像素,并将结果提供给名为 mix (我们的视频混合器)的元素。最后的点是必需的,并指示gstreamer搜索名为“mix”的现有元素,而不是寻找过滤器。

你可以用 filesrc location = video.avi替换 v4l2src device = / dev / video1 ! decodebin 从视频文件中获取输入。

jpegenc替换 xvimagesink ! avimux! filesink location = out.avi 将结果写入视频文件。

答案 1 :(得分:5)

事实证明,gstreamer可以合并两个视频,使用视频混合滤镜将它们并排放入输出视频。

一个基本管道,它接收两个输入文件,将它们缩放为相同的大小,然后合并它们并将它们编码为theora视频可能如下所示:

filesrc -> decodebin -> ffmpegcolourspace -> videoscale ->  videobox -> videorate
                                                                                  \
filesrc -> decodebin ->  ffmpegcolourspace  ->  videoscale  ->  videorate   ->    videomixer -> ffmpegcolourspace -> theoraenc -> oggmux -> filesink

如何实现此管道取决于语言。我使用Ruby绑定进行原型设计,并且效果非常好。

答案 2 :(得分:0)

我想起了{p> AviSynth。我在很多年前在Windows下使用它,它在任意后期处理方面相当不错。 AviSynth v3应该在Linux下本地运行,但还远未准备好。但是,有些工具可以使用Wine运行以前的版本。

答案 3 :(得分:0)

MEncoder可以在linux上本地执行此操作。您可以分叉他们的代码,或调用二进制文件。