我已閱讀了大部分關於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沒有很好的瞭解,任何幫助都非常感謝。
(請注意,在前面的代碼中,我省略了第二個線程的創建,因爲問題是,流水線沒有流。)
我沒有pthreads或gstreamer的經驗,或者線程在unix盒子上的工作方式,但我會指出你的應用程序直接通過主要方法並退出。我會下注pthreads是後臺線程,並在主線程終止後立即終止。您必須阻止該主要方法並等待一切完成。 – Will
也沒有理由爲您的GStreamer管道添加額外的線程。 GStreamer在內部產生自己的線程,其API大部分都是非阻塞的。 –
@Florian Zwoch ..是的,我已經嘗試在同一個線程上運行管道,但它不會從那裏繼續。據我所知,這是封鎖。我看到我沒有得到任何答案,所以我的問題真的很愚蠢,第一次沒有人知道答案。至少有人能指出我將Gstreamer與其他非Gstreamer相關的線程結合起來的良好文檔的方向嗎? – user3521388