2017-02-27 61 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

如果堵塞,意味着管道沒有預軋。這意味着別的東西不適合你的管道。如果管道正確地將其狀態更改爲播放,則會繼續執行程序。 –