在Rust中,有没有一种方法可以将`gstreamer :: Bin`子类化,使我仍然拥有其原始方法?

问题描述

我正在尝试继承gstreamer::Bin的子类,以覆盖其Bin::handle_message方法,目的是拦截流结束消息,将其丢弃并发出已被丢弃的信号(使用默认的{{1 }}的行为(如果它们不是流结束消息)。

问题是,我仍然需要其原始方法(例如Bin::handle_messageBin::add等),因为我需要堆叠在原始Bin::add_pad之上的唯一行为是消息像前面提到的那样拦截。

我提到我仍然需要它的原始方法,因为当我尝试遵循this示例时,我写的结果gstreamer::Bin不满足CustomBin,因此不满足可以进行IsA<Bin>的全面实施,从而又使其没有原始的gstreamer::GstBinExt方法。

我也遇到了this示例,但是最终我不想为要动态添加和从管道中删除的每组元素重新实现消息拦截行为。我也不需要将其注册为适当的元素,只需要在自己的板条箱以及其中定义的管道内使用它即可。

作为参考,我将在下文中尝试实现这一目标。

我想念什么?


gstreamer::Bin

解决方法

您的CustomBin结构是该类型的内部实现,而不是glib::Object(或gst::Bin)本身。如果您将其与例如那么,这就是Java的所有私有字段和受保护的虚拟方法。

这足以创建一个新实例并将其用作其任何父类

let obj: glib::Object = glib::Object::new(CustomBin::get_type(),&[("name","bla")]).unwrap();
let bin: gst::Bin = obj.downcast::<gst::Bin>().unwrap();

请注意,上面的objbin不是您的CustomBin结构。

要在CustomBin周围创建公共Rust API,您可以使用glib_wrapper!宏。您可以找到该here的示例。不要只看那些突出显示的行,还要看上面的所有代码。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...