GStreamer 的最低开销源格式?
Lowest overhead source format for GStreamer?
我需要在 Rust 中生成实时叠加层以用作 GStreamer 源。
我有几个可变变量;需要叠加在 1080p60 视频流上的字符串数组和一些传感器数据。
最好先生成原始流,还是首先编码为 MJPG? Rust 应用程序和 GStreamer 之间哪种方法的总开销最少?
这里有多个选项供您选择,具体取决于您希望如何生成叠加层。我不建议通过 MJPEG 或其他任何方式,而只是处理原始视频。这对于 Rust GStreamer 绑定来说非常方便,并且基本上具有尽可能低的开销。
1) 生成覆盖原始视频流,每一帧在没有覆盖的地方都是完全透明的。这可以类似于 Rust GStreamer 绑定中的 appsrc 示例来完成 here
然后您可以将其传递给合成器元素(或 glvideomixer 或其他使用某些硬件的混合器元素 API),它可以合成您的普通视频流和覆盖流。
为了生成叠加层,您可以使用任何您想要的可以在 ARGB(或任何其他原始视频格式)之上呈现文本等的 API。一种选择是开罗,它也有 Rust 绑定。
与下一个解决方案相比,它的缺点是您必须生成完整的视频帧,合成器必须为每个帧生成另一个视频帧。必须进行大量复制。
2) 您可以在 Rust 中编写一个 GStreamer 元素作为视频过滤器并在视频帧上绘制叠加层。有一个示例视频过滤器 here and I wrote an article explaining each part here
您不必在 src/lib.rs 中完成所有插件初始化工作,但可以只在您的应用程序中拥有与 RGB2Gray 转换器的源文件等效的内容,并在代码的开头。
视频过滤器本身也会更简单一些,因为输入和输出格式相同。
为了生成叠加层,您可以使用任何您想要的可以在 ARGB(或任何其他原始视频格式)之上呈现文本等的 API。一种选择是开罗,它也有 Rust 绑定。
除了可能需要的视频格式转换(如果输入视频的格式不同于您支持在其上绘制的格式),这将是最有效的方法。
3) 使用 cairooverlay GStreamer 元素。它基本上像 2) 一样工作,并直接为您提供 Cairo 上下文,然后您可以使用它在视频帧顶部绘制任何您想要的内容。对于通过元素的每一帧,您都会收到一个带有开罗上下文的信号("draw" 信号)。
但是您必须使用 Cairo API,并且您可能必须向 Rust Cairo 绑定添加一些 API 扩展。我不能 100% 确定所需的一切是否已经可用。
我需要在 Rust 中生成实时叠加层以用作 GStreamer 源。
我有几个可变变量;需要叠加在 1080p60 视频流上的字符串数组和一些传感器数据。
最好先生成原始流,还是首先编码为 MJPG? Rust 应用程序和 GStreamer 之间哪种方法的总开销最少?
这里有多个选项供您选择,具体取决于您希望如何生成叠加层。我不建议通过 MJPEG 或其他任何方式,而只是处理原始视频。这对于 Rust GStreamer 绑定来说非常方便,并且基本上具有尽可能低的开销。
1) 生成覆盖原始视频流,每一帧在没有覆盖的地方都是完全透明的。这可以类似于 Rust GStreamer 绑定中的 appsrc 示例来完成 here
然后您可以将其传递给合成器元素(或 glvideomixer 或其他使用某些硬件的混合器元素 API),它可以合成您的普通视频流和覆盖流。
为了生成叠加层,您可以使用任何您想要的可以在 ARGB(或任何其他原始视频格式)之上呈现文本等的 API。一种选择是开罗,它也有 Rust 绑定。
与下一个解决方案相比,它的缺点是您必须生成完整的视频帧,合成器必须为每个帧生成另一个视频帧。必须进行大量复制。
2) 您可以在 Rust 中编写一个 GStreamer 元素作为视频过滤器并在视频帧上绘制叠加层。有一个示例视频过滤器 here and I wrote an article explaining each part here
您不必在 src/lib.rs 中完成所有插件初始化工作,但可以只在您的应用程序中拥有与 RGB2Gray 转换器的源文件等效的内容,并在代码的开头。
视频过滤器本身也会更简单一些,因为输入和输出格式相同。
为了生成叠加层,您可以使用任何您想要的可以在 ARGB(或任何其他原始视频格式)之上呈现文本等的 API。一种选择是开罗,它也有 Rust 绑定。
除了可能需要的视频格式转换(如果输入视频的格式不同于您支持在其上绘制的格式),这将是最有效的方法。
3) 使用 cairooverlay GStreamer 元素。它基本上像 2) 一样工作,并直接为您提供 Cairo 上下文,然后您可以使用它在视频帧顶部绘制任何您想要的内容。对于通过元素的每一帧,您都会收到一个带有开罗上下文的信号("draw" 信号)。
但是您必须使用 Cairo API,并且您可能必须向 Rust Cairo 绑定添加一些 API 扩展。我不能 100% 确定所需的一切是否已经可用。