【问题标题】:Using Gstreamer with pthreads将 Gstreamer 与 pthread 一起使用
【发布时间】: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


【解决方案1】:

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

这是不正确的:

gst_parse_launch ("<b>gst-launch</b> v4l2src ! xvimagesink", NULL);

应该是:

gst_parse_launch ("v4l2src ! xvimagesink", NULL);

GST_DEBUG 环境变量设置为某个级别。在代码中添加检查和错误处理程序(例如监听管道总线并打印错误或检查gst_parse_launch(...) != NULL 并且状态确实更改为“正在播放”)。

【讨论】:

  • 是的,您提到的第一件事不是问题,因为 gst-parse-launch 解析命令行命令并且“v4l2src!xvimagesink”不起作用。诀窍是放置一个 sleep(5) 或阻止程序以 main() 函数结束,因此感谢 Will 的评论和帮助。不过,弗洛里安·沃佐克(Florian Wzoch)所说的是错误的。在将管道设置为播放后,我尝试做一些事情,但它没有这样做。所以可能有办法以非阻塞方式创建和流式传输管道,但我这样做的方式肯定是阻塞它。
  • 如果它的阻塞意味着管道没有预滚动。这意味着其他东西不适用于您的管道。如果管道正确地将其状态更改为正在播放,它将继续执行程序。
猜你喜欢
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多