【发布时间】:2017-03-01 19:18:00
【问题描述】:
我已经阅读了大部分关于 Gstreamer 以及如何使用它的文档,但是关于 Gstreamer 和其他非 gstreamer 相关的线程。
所以我正在尝试创建一个简单的应用程序,其中在一个线程上我有一个简单的管道,其中源元素直接连接到接收器元素。我正在使用“pthread”库来管理线程。然后我创建另一个 pthread 来处理程序的其他部分。
为此,我使用了这个示例 (http://www.thegeekstuff.com/2012/04/create-threads-in-linux/?utm_source=feedburner)。
这是程序:
#include<gst/gst.h>
#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
pthread_t tid[2];
void* doSomeThing(void *arg)
{
GMainLoop *loop;
printf("\n Completed. \n");
GstElement *pipeline;
loop = g_main_loop_new (NULL, FALSE);
pipeline = gst_parse_launch ("gst-launch v4l2src ! xvimagesink", NULL);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
g_main_loop_run (loop);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (GST_OBJECT (pipeline));
g_main_loop_unref (loop);
return NULL;
}
int main(int argc, char *argv[])
{
gst_init (&argc, &argv);
pthread_create(&(tid[0]), NULL, &doSomeThing, NULL);
return 0;
}
所以我编译。没有错误。当我运行它时,它不会打开任何窗口,也不会开始流式传输或任何东西。我觉得这就是我创建管道线程的方式。所以底线是我对 Gstreamer 没有很好的了解,非常感谢任何帮助。
(请注意,在前面的代码中,我省略了第二个线程的创建,因为问题是管道没有流式传输。)
【问题讨论】:
-
我对 pthread 或 gstreamer 或线程如何在 unix 机器上工作没有一点经验,但我会指出您的应用程序直接通过该 main 方法运行并退出。我打赌 pthread 是后台线程,一旦主线程终止就会被杀死。您必须阻止该 main 方法并等待一切完成。
-
另外,没有理由为您的 GStreamer 管道设置额外的线程。 GStreamer 在内部产生自己的线程,并且其 API 在大多数情况下是非阻塞的。
-
@Florian Zwoch .. 是的,我试过在同一个线程上运行管道,但它不会从那里继续。据我所知,它是阻塞的。我看到我没有得到任何答案,所以我的问题真的很愚蠢,而且第一次没有人知道答案。至少有人可以指出关于将 Gstreamer 与其他非 Gstreamer 相关线程结合的良好文档的方向吗?
-
GStreamer 在自己的线程中运行。这可能就是为什么你的代码中有 Glib 主循环来运行某些东西的原因。威尔关于 main() 立即退出的评论是正确的。到那时,GStreamer 将无能为力。我建议在考虑修改额外线程之前阅读一些 GStreamer 示例。很可能您甚至都不需要它们。
标签: multithreading pthreads gstreamer