2017-02-27 60 views
0

我已阅读了大部分关于Gstreamer以及如何使用它的文档,但很少有关于将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没有很好的了解,任何帮助都非常感谢。

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

+1

我没有pthreads或gstreamer的经验,或者线程在unix盒子上的工作方式,但我会指出你的应用程序直接通过主要方法并退出。我会下注pthreads是后台线程,并在主线程终止后立即终止。您必须阻止该主要方法并等待一切完成。 – Will

+0

也没有理由为您的GStreamer管道添加额外的线程。 GStreamer在内部产生自己的线程,其API大部分都是非阻塞的。 –

+0

@Florian Zwoch ..是的,我已经尝试在同一个线程上运行管道,但它不会从那里继续。据我所知,这是封锁。我看到我没有得到任何答案,所以我的问题真的很愚蠢,第一次没有人知道答案。至少有人能指出我将Gstreamer与其他非Gstreamer相关的线程结合起来的良好文档的方向吗? – user3521388

回答

0

g_main_loop_run()是能说会道的事件循环:里面有一个循环(发送当你想终止它的时候给它一个退出信号)。就是这样,其他任何与线程交互无关。

这是不正确:

gst_parse_launch ("gst-launch v4l2src ! xvimagesink", NULL);

大概应该是:

gst_parse_launch ("v4l2src ! xvimagesink", NULL); 

GST_DEBUG环境变量一定程度。在代码中添加检查和错误处理程序(如监听管道总线和打印错误,或检查gst_parse_launch(...) != NULL和状态是否真的变为“正在播放”)。

+0

是的,你提到的第一件事不是问题,因为gst-parse-launch解析命令行命令,“v4l2src!xvimagesink”不起作用。 诀窍是什么让睡眠(5)或停止在main()函数结束程序,所以感谢威尔的评论和帮助。 Florian Wzoch说的是错误的。设置管道后,我尝试做一些事情,但没有做到。所以可能有方法以非阻塞的方式创建和流式传输管道,但我这样做的方式绝对阻止它。 – user3521388

+0

如果堵塞,意味着管道没有预轧。这意味着别的东西不适合你的管道。如果管道正确地将其状态更改为播放,则会继续执行程序。 –