运行 每个 GStremer 管道到一个单独的 (GLib) 线程

Running every GStremer pipeline into a separate (GLib) thread

所有 GStremer 样本都通过以下某种形式初始化 GLib 主胎面:

loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(loop);

据我了解,这个主循环用于所有信号处理。 总线消息也在其中处理。

所以我有点担心如果我同时 运行 多个管道会发生什么。 或者其中一些有一个 issue/improper 实现。

很可能对于重负载,最好的解决方案是将管道分离到多个进程,从而减轻内存泄漏、挂起、死锁等所有可能的问题,而不影响主应用程序。

无论如何,至少 运行将它们分成单独的线程是有益的。

显然可以启动多个 GLib 主线程,首先创建 GMainContext。但是我无法理解(显然我缺少知识)之后如何 "assign" 他们到管道或向他们发信号等。 例如在"g_signal_connect"和"g_signal_emit"中没有指定在哪个"main"线程上执行。

这里有些 post 声称这是可能的(GStreamer 支持不同的主线程),但我找不到详细信息。

this 线程中讨论了类似的问题,但老实说我无法理解它。

this Whosebug post 中讨论了如何将超时附加到不同的 GLib 主线程。 我想可以为 GStreamer 管道和对象制作类似的东西,但我不确定。

谁能给我一点启发?

我将在 GStreamer-devel 论坛中发布相同问题的答案: http://gstreamer-devel.966125.n4.nabble.com/Running-every-GStremer-pipeline-into-a-separate-GLib-thread-td4694469.html

引用:

GMainLoop 对于 GStreamer 是可选的(方便但可选)。你可以 直接使用 GstBus API。至于信号,它们是同步的,并且 不使用消息。

如果您决定使用 GMainLoop,您将只需要一个来处理 异步消息,因为所有消息都被序列化到循环中 队列。多管道是因为你不方便而变得方便 必须处理多个 GstBus 对象。

Streamer 已经将流媒体拆分为单独的线程。这 mainloop 线程始终可以用于其他任务(如 UI 任务)。

:引用结束