结合GStreamer,AnyEvent和EV(perl)

时间:2011-05-20 14:36:36

标签: perl gstreamer

我正在尝试在现有的使用AnyEvent和EV事件循环的perl应用程序中使用GStreamer。它不是Glib应用程序。我已经加载了EV :: Glib以获得使用EV的Glib主循环。我坦率地承认,就格里布而言,我很无知。我认为我拥有所需的所有功能,但我正在努力(失败)让他们一起工作。

如果我使用独立的perl程序来构建GStreamer管道,然后将其置于PLAYING状态,那么这一切都可以正常工作。我不需要使用Glib主循环做任何事情,也不需要使用GStreamer总线。

在我的现有应用程序中,在AnyEvent事件处理程序的上下文中构建相同的管道,然后它无法运行管道。我曾尝试各种方法来练习它,包括调用$pipeline->get_bus->poll()。如果我在原始事件处理程序中重复调用...->poll()(也就是处理程序没有返回),那么它可以工作,但这显然不是一个有效的解决方案。在AnyEvent计时器回调中调用...->poll()不会运行管道。

我现在最好的猜测是EV :: Glib可以实现某种程度的集成,但实际上并没有运行主循环的必要位。我错过了什么?

2 个答案:

答案 0 :(得分:0)

我带着类似的问题来到这里关于EV :: Glib的使用,但最终没有使用它的问题..所以也许我错过了你在这里尝试做的事情。

这是我用来测试EV :: Glib如何工作的简单脚本:

use EV::Glib;
use Gtk2 '-init';

my $t = EV::timer 1, 1, sub { print "I am here!\n" };
Glib::Timeout->add(1000, sub { print "I am also here!\n" });

my $window = Gtk2::Window->new('toplevel');
$window->signal_connect(delete_event => sub { EV::unloop });

my $button = Gtk2::Button->new('Action');
$button->signal_connect(clicked => sub { 
    print("Hello Gtk2-EV-Perl\n");
});

$window->add($button);
$window->show_all;

EV::loop;

使用此按钮上的信号处理程序将起作用,两个计时器事件也将起作用。因此,EV循环将正确驱动整个事物。

我可以看到的主要问题是documentation:"此[模块]使Glib与EV兼容。调用Glib主循环或多或少等同于调用EV :: loop(但反之亦然,您必须使用Glib主循环函数)。" 这意味着如果你正在联系一个EV :: loop事件,它就不会等同于一个Glib :: mainloop,所以可能不会“痒痒”。 (或者#9;请勾勒出你的GStreamer活动)。也许这可能是您遇到的问题,特别是如果您正在使用AnyEvent及其通用回调,这些回调很可能转换为EV :: loop调用而不是Glib :: MainLoop调用。

这只是一个猜测 - 我自己从未使用过GStreamer,而且我当然不知道你在没有看到更多代码的情况下想要实现的目标。但我认为我的半结论是非常合理的建议,无论如何:如果你正在使用特定于Glib的东西,你可能应该使用Glib将事件连接到它。

答案 1 :(得分:0)

EV :: Glib将Glib嵌入EV中 - 您(以及其他所有人)必须使用EV才能使其正常运行。有可能gstreamer不知道这一点,并且不尊重地在内部调用glib mainloop函数,这不起作用。

幸运的是,还有另一个模块正好相反:Glib :: EV。该模块使Glib内部使用EV。使用它时,您可以/应该使用glib主循环功能(您可以使用EV观察者,但不能从EV回调调用glib函数,因为glib不支持)。

它可能更适合您的应用程序,因为使用glib的应用程序将“正常工作”,因为EV使用完全是内部的。

另一个可能的问题是perl模块是动态链接的,只是“意外地”获得了相同的库。要使所有这些工作正常,您需要确保所有perl模块链接到相同的共享 glib库。