Объединение GStreamer, AnyEvent и EV (perl) - PullRequest
4 голосов
/ 20 мая 2011

Я пытаюсь использовать GStreamer в существующем приложении perl, которое использует AnyEvent с циклом событий EV.Это не приложение Glib.Я загрузил EV :: Glib, чтобы заставить основной цикл Glib использовать EV.Я свободно признаю, что по отношению к Глибу я довольно невежественен.Я думаю, что у меня есть все биты, которые мне нужны, но я изо всех сил (не могу) заставить их работать вместе.

Если я использую отдельную программу Perl для построения конвейера GStreamer и затем переводю его в состояние PLAYINGтогда все просто работает.Мне не нужно ничего делать с mainloop-ом Glib или иным образом щекотать шину GStreamer.

Построение того же конвейера в моем существующем приложении в контексте обработчика событий AnyEvent, затем он не может запустить конвейер,Я поиграл с различными способами, чтобы попытаться осуществить это, включая вызов $pipeline->get_bus->poll().Если я неоднократно вызываю ...->poll() в исходном обработчике событий (то есть обработчик не возвращает), то он работает, но это явно не верное решение.Вызов ...->poll() в обратном вызове таймера AnyEvent не запускает конвейер.

На данный момент мое лучшее предположение состоит в том, что EV :: Glib обеспечивает некоторый уровень интеграции, но фактически не запускает необходимые биты основного цикла.,Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2013

EV :: Glib встраивает Glib в EV - вы (и все остальные) должны использовать EV, чтобы он работал. Скорее всего, gstreamer не знает об этом и неуважительно вызывает внутренние функции glib mainloop, что не работает.

К счастью, есть еще один модуль, который делает наоборот: Glib :: EV. Этот модуль заставляет Glib использовать EV внутри. При его использовании вы можете / должны использовать функции glib mainloop (вы можете использовать наблюдатели EV, но вы не можете вызывать функции glib из обратных вызовов EV, поскольку glib этого не поддерживает).

Возможно, он лучше подходит для вашего приложения, поскольку приложения, использующие glib, будут «просто работать», поскольку использование EV полностью внутреннее.

Другая возможная проблема заключается в том, что модули perl динамически связаны, и только «случайно» получают одну и ту же библиотеку. Чтобы все это работало, вам нужно убедиться, что все модули Perl связаны с одной и той же общей библиотекой glib.

0 голосов
/ 19 ноября 2011

Я пришел сюда с похожим вопросом, касающимся использования 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 будет правильно управлять всем этим.

Основная проблема, которую я вижу в документации : «Этот [модуль] делает Glib совместимым с EV. Вызовы в главный цикл Glib более или менее эквивалентны вызовам EV :: loop ( , но не наоборот, вы должны использовать функции основного цикла Glib ). " Это означает, что если вы подключаете событие EV :: loop, оно не будет приравниваться к Glib :: mainloop и поэтому может не «щекотать» (или «не щекотать») ваше событие GStreamer. Возможно, это может быть проблемой, с которой вы столкнулись, особенно если вы используете AnyEvent и его универсальные обратные вызовы, которые, вероятно, преобразуются в вызовы EV :: loop вместо вызовов Glib :: MainLoop.

Хотя это всего лишь предположение - я никогда сам не использовал GStreamer и, конечно, не знаю, чего вы пытаетесь достичь, не увидев больше кода. Но я думаю, что мой недооцененный вывод - довольно здравый совет, независимо от того: если вы используете что-то специфическое для Glib, вам, вероятно, следует подключать к нему события с помощью Glib.

...