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

发布于 2024-07-27 15:31:59 字数 263 浏览 7 评论 0原文

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

我希望整个输出视频是两个并排的原始视频。 如果做不到这一点,我的第二个最佳选择是“画中画”风格的视频,演示者位于角落的小框架中。

经过几个小时的研究,GStreamer 看起来可能能够做到这一点。 在我花更多时间尝试之前,有人可以确认一下吗?

如果不能,是否还有其他我可以使用的 API?

I'd like to write a simple linux CLI application that can take 2 video sources (1 of a presenter talking and 1 with their slides and no audio) and merge them.

I'd like the entire output video to be the two original videos, side by side. Failing that, my second best option would be a "picture in picture" style video, with the presenter in a small frame in the corner.

From a few hours research, GStreamer looks like it might be able to do this. Can anyone confirm it before I spend more time trying it out?

If it can't, are there other APIs out there that I might be able to use?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

踏月而来 2024-08-03 15:31:59

这是使用 gst-launch 的简单(有效)设置(在 Ubuntu/Debian 上安装 gstreamer-tools 软件包):

gst-launch v4l2src device=/dev/video1 ! 视频尺度! ffmpeg颜色空间! 视频/x-raw-yuv,宽度=640,高度=480! videobox border-alpha=0 left=-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 从视频文件中获取输入。

将 xvimagesink 替换为 jpegenc ! 阿维穆克斯! filesink location=out.avi 将结果写入视频文件。

Here is a simple (working) setup using gst-launch (install the gstreamer-tools package on Ubuntu/Debian):

gst-launch v4l2src device=/dev/video1 ! videoscale ! ffmpegcolorspace ! video/x-raw-yuv, width=640, height=480 ! videobox border-alpha=0 left=-640 ! videomixer name=mix ! ffmpegcolorspace ! xvimagesink v4l2src ! videoscale ! ffmpegcolorspace ! video/x-raw-yuv, width=640, height=480 ! videobox right=-640 ! mix.

This basically reads two videos using video 4 linux 2, one from the default device and another stream from /dev/video1. You might want to change that if your setup is different.

The first part (non-bold) is responsible for reading the video from the capture device, negotiating a size and colorspace (videoscale ! ffmpegcolorspace), forcing a specific video format (video/x-raw-yuv, width=640, height=480), adding 640 transparent pixels to the left (thereby moving the picture to the right) and creating a videomixer with the name "mix". Finally it auto-negotiates the colorspace again and displays the result using a XVideo window.

The second part (in bold) reads the second video stream (from the default capture device, add device=/dev/videoX to choose a different device), then does the same colorspace, size negotiation and video format selection as for the first stream, then moves the video 640 pixels to the left and feeds the result to the element named mix (our video mixer). The dot at the end is required and instructs gstreamer to search for an existing element named "mix" instead of looking for a filter.

You could replace v4l2src device=/dev/video1 with filesrc location=video.avi ! decodebin to get the input from a video file.

Replace xvimagesink with jpegenc ! avimux ! filesink location=out.avi to write the result to a video file.

丢了幸福的猪 2024-08-03 15:31:59

事实证明,gstreamer 可以合并两个视频,使用 videomixer 过滤器将它们并排放置到输出视频中。

一个基本的管道需要两个输入文件,将它们缩放到相同的大小,然后将它们合并并将它们编码成理论视频,它可能看起来像这样:

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

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

It turns out gstreamer can merge two videos, placing them side by side into an output video using the videomixer filter.

A basic pipeline that takes two input files, scales them to be the same size, then merges them and encodes them into a theora video might look like this:

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

How you implement this pipeline depends on the language. I prototyped with the Ruby bindings, and it works really well.

忆伤 2024-08-03 15:31:59

我想到了AviSynth。 我很多年前就在 Windows 下使用过它,它在任意后处理方面非常出色。 AviSynth v3 应该可以在 Linux 下本地运行,但还远没有准备好。 不过,有一些工具可以使用 Wine 运行以前的版本。

AviSynth comes to my mind. I’ve used it many years ago under Windows and it’s pretty good at arbitrary post-processing. AviSynth v3 is supposed to run natively under Linux but is still far from ready. There are tools to run previous version with Wine, though.

丢了幸福的猪 2024-08-03 15:31:59

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

MEncoder can do that natively on linux. You can fork their code, or invoke the binary.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文