Multithreading 将Gstreamer与pthreads一起使用

Multithreading 将Gstreamer与pthreads一起使用,multithreading,pthreads,gstreamer,Multithreading,Pthreads,Gstreamer,我已经阅读了大多数关于Gstreamer以及如何使用它的文档,但是很少有人解释如何将Gstreamer与其他非结构化应用程序结合起来 gstreamer相关线程 因此,我试图创建一个简单的应用程序,其中一个线程上有一个简单的管道,其中一个源元素直接连接到一个汇元素。我正在使用“pthread”库来管理线程。然后我创建另一个pthread来处理程序的其他部分 为此,我使用了这个示例() 节目如下: #include<gst/gst.h> #include<stdio.h>

我已经阅读了大多数关于Gstreamer以及如何使用它的文档,但是很少有人解释如何将Gstreamer与其他非结构化应用程序结合起来 gstreamer相关线程

因此,我试图创建一个简单的应用程序,其中一个线程上有一个简单的管道,其中一个源元素直接连接到一个汇元素。我正在使用“pthread”库来管理线程。然后我创建另一个pthread来处理程序的其他部分

为此,我使用了这个示例()

节目如下:

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
pthread_t tid[2];
void*doSomeThing(void*arg)
{
GMainLoop*循环;
printf(“\n已完成。\n”);
GstElement*管道;
loop=g_main_loop_new(NULL,FALSE);
pipeline=gst_parse_launch(“gst launch v4l2src!xvimagesink”,NULL);
gst元素设置状态(管道、gst状态);
g_主循环运行(循环);
gst\元素\集合\状态(管道,gst\状态\空);
gst_对象_unref(gst_对象(管道));
g_主回路_unref(回路);
返回NULL;
}
int main(int argc,char*argv[])
{
gst_init(&argc,&argv);
pthread_create(&(tid[0]),NULL,&doSomeThing,NULL);
返回0;
}
所以我编译。没有错误。当我运行它时,它不会打开任何窗口,也不会启动流媒体或任何东西。我觉得这就是我创建管道线程的方式。所以底线是我对Gstreamer不太了解,非常感谢您的帮助

(注意,在前面的代码中,我忽略了创建第二个线程,因为问题是管道没有流。)

g_main_loop_run()
是一个GLib事件循环:内部有一个循环(当您想要终止它时,向它发送退出信号)。就这样,其他任何东西都与线程交互无关

这是不对的:

gst_解析_启动(“gst启动v4l2src!xvimagesink”,NULL)

应该是:

gst_parse_launch ("v4l2src ! xvimagesink", NULL);

将环境变量设置为某个级别。向代码中添加检查和错误处理程序(例如,在管道总线上侦听并打印错误,或者检查
gst\u parse\u launch(…)!=NULL
并且状态确实更改为“playing”)。

我对pthreads或gstreamer没有任何经验,或者线程如何在unix机器上工作,但我要指出,您的应用程序直接通过主方法运行并退出。我敢打赌pthreads是后台线程,一旦主线程终止就会被终止。您必须阻止该主方法并等待所有操作完成。此外,没有理由为您的GStreamer管道提供额外的线程。GStreamer在内部生成自己的线程,它的API在很大程度上是非阻塞的。@Florian Zwoch。。是的,我试着在同一个线程上运行管道,但从那以后就不能继续了。据我所知,它被阻塞了。我发现我没有得到任何答案,所以要么我的问题真的很愚蠢,第一次没有人知道答案。至少有人能为我指出将Gstreamer与其他与Gstreamer无关的线程相结合的好文档的方向吗?Gstreamer在自己的线程中运行。这可能就是为什么在代码中有Glib主循环来运行某些东西。威尔关于main()立即退出的评论是正确的。到那时,GStreamer将什么也做不了。我建议阅读一些GTRAPER样本,然后再考虑额外的线程修整。很可能您甚至不需要它们。是的,您提到的第一件事不是问题,因为gst parse launch解析命令行命令,“v4l2src!xvimagesink”不起作用。诀窍是使程序进入睡眠状态(5)或停止以main()函数结束,多亏了Will的评论和帮助。弗洛里安·沃佐奇说的是错的。在设置管道播放后,我尝试做了一些事情,但没有成功。所以可能有方法以非阻塞的方式创建和流式传输管道,但我所做的方法肯定是阻塞它。如果它阻塞,则意味着管道没有预滚动。这意味着您的管道中没有其他功能。如果管道正确地将其状态更改为播放,它将继续执行程序。