我想编写一个简单的 linux CLI 应用程序,它可以获取 2 个视频源(1 个演讲者正在讲话,1 个有幻灯片,没有音频)并将它们合并。
我希望整个输出视频是两个原始视频,并排。如果做不到这一点,我的第二个最佳选择是“画中画”风格的视频,演示者在角落的一个小框架中。
从几个小时的研究来看,GStreamer 似乎可以做到这一点。在我花更多时间尝试之前,有人可以确认吗?
如果不能,是否还有其他我可以使用的 API?
我想编写一个简单的 linux CLI 应用程序,它可以获取 2 个视频源(1 个演讲者正在讲话,1 个有幻灯片,没有音频)并将它们合并。
我希望整个输出视频是两个原始视频,并排。如果做不到这一点,我的第二个最佳选择是“画中画”风格的视频,演示者在角落的一个小框架中。
从几个小时的研究来看,GStreamer 似乎可以做到这一点。在我花更多时间尝试之前,有人可以确认吗?
如果不能,是否还有其他我可以使用的 API?
这是一个使用 gst-launch 的简单(工作)设置(在 Ubuntu/Debian 上安装gstreamer-tools包):
gst-launch v4l2src device=/dev/video1 !视频缩放!ffmpeg色彩空间!视频/x-raw-yuv,宽度=640,高度=480!视频框边框-alpha=0 左=-640 !视频混合器名称=混合!ffmpeg色彩空间!xvimagesink v4l2src !视频缩放!ffmpeg色彩空间!视频/x-raw-yuv,宽度=640,高度=480!视频盒右=-640!混合。
这基本上是使用 video 4 linux 2 读取两个视频,一个来自默认设备,另一个来自 /dev/video1。如果您的设置不同,您可能需要更改它。
第一部分(非粗体)负责从采集设备读取视频,协商大小和色彩空间(videoscale !ffmpegcolorspace),强制特定的视频格式(video/x-raw-yuv, width=640, height= 480),向左侧添加 640 个透明像素(从而将图片向右移动)并创建一个名为“mix”的视频混合器。最后,它再次自动协商色彩空间并使用 XVideo 窗口显示结果。
第二部分(粗体)读取第二个视频流(从默认捕获设备,添加device=/dev/videoX以选择不同的设备),然后执行与第一个流相同的色彩空间、大小协商和视频格式选择,然后将视频向左移动 640 像素,并将结果提供给名为mix的元素(我们的视频混合器)。最后的点是必需的,它指示 gstreamer 搜索名为“mix”的现有元素,而不是寻找过滤器。
您可以将v4l2src device=/dev/video1替换为filesrc location=video.avi !decodebin从视频文件中获取输入。
用jpegenc替换xvimagesink !!filesink location=out.avi将结果写入视频文件。
事实证明,gstreamer 可以合并两个视频,使用 videomixer 过滤器将它们并排放置到输出视频中。
采用两个输入文件的基本管道,将它们缩放为相同大小,然后将它们合并并将它们编码为 theora 视频,可能如下所示:
filesrc -> decodebin -> ffmpegcolourspace -> videoscale -> videobox -> videorate
\
filesrc -> decodebin -> ffmpegcolourspace -> videoscale -> videorate -> videomixer -> ffmpegcolourspace -> theoraenc -> oggmux -> filesink
如何实现此管道取决于语言。我使用 Ruby 绑定进行了原型设计,效果非常好。
我想到了AviSynth 。我多年前在 Windows 下使用过它,它非常擅长任意后期处理。AviSynth v3 应该在 Linux 下本机运行,但还远远没有准备好。不过,有一些工具可以用 Wine 运行以前的版本。
MEncoder can do that natively on linux. You can fork their code, or invoke the binary.