将GSTREAMER与Pthreads一起使用



我已经阅读了有关GSTREAMER和如何使用它的大多数文档与Gstreams相关的线程。

因此,我试图创建一个简单的应用程序,其中在一个线程上,我有一个简单的管道,该管道将直接连接到水槽元素连接一个源元素。我正在使用" 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没有很好的了解,并感谢任何帮助。

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

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

这是不正确的:

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

应该是:

gst_parse_launch ("v4l2src ! xvimagesink", NULL);

GST_DEBUG环境变量设置为一定级别。将检查和错误处理程序添加到代码(例如在管道的总线上聆听并打印错误或检查gst_parse_launch(...) != NULL和状态是否确实更改为"播放")。

最新更新