1

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

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

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

所以我有点担心如果我同时运行多个管道会发生什么。或者其中一些存在问题/不正确的实现。

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

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

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

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

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

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

有人可以启发我一点吗?

4

1 回答 1

0

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

引用:

GMainLoop 对于 GStreamer 是可选的(方便但可选)。您可以直接使用 GstBus API。至于信号,这些是同步的,不使用消息。

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

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

: 引用结束

于 2020-10-21T15:50:27.790 回答