如何解决在Rust中,有没有一种方法可以将`gstreamer :: Bin`子类化,使我仍然拥有其原始方法?
我正在尝试继承gstreamer::Bin
的子类,以覆盖其Bin::handle_message
方法,目的是拦截流结束消息,将其丢弃并发出已被丢弃的信号(使用默认的{{1 }}的行为(如果它们不是流结束消息)。
问题是,我仍然需要其原始方法(例如Bin::handle_message
,Bin::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();
请注意,上面的obj
和bin
不是您的CustomBin
结构。
要在CustomBin
周围创建公共Rust API,您可以使用glib_wrapper!
宏。您可以找到该here的示例。不要只看那些突出显示的行,还要看上面的所有代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。