Gstreamer手動搭建pipeline

Gstreamer的基本組成就是elements, 這些elements把數據從source經過filter傳到sink

1.首先初始化Gstreamer

gst_init(NULL, NULL);

2.創建source 和sink

GstElement *source = gst_element_factory_make("videotestsrc", "source");

GstElement *sink = gst_element_factory_make("autovideosink", "sink");

gst_element_factory_make();用來創建element,

參數1:要創建element的類型,

參數2:創建的element的名字,這個參數是非必須的,如果傳NULL時,GStreamer會自動創建一個名字

videotestsrc是一個source element(生產數據),會創建一個video模式。這個element常用在調試中,很少在實際中用

autovideosink是一個sink element(消費數據),會在一個窗口顯示收到的圖像數據。autovideosink會自動選擇最合適的video sink。

3.創建pipeline

GstElement pipeline = gst_pipeline_new("test-pipeline");//創建一個空的pipeline

4.在pipeline中添加element

gst_bin_add_many(GST_BIN(pipeline), source, sink, NULL);

gst_bin_add_many()方法在pipeline中加入element,這個方法會接收一系列的element作爲輸入參數,最後由NULL終止。

gst_bin_add()方法可以增加單個element;

5.將pipeline中的elements連接起來

if(gst_element_link(source, sink) != TRUE){

    g_printerr("Link elements failed \n");

     gst_object_unref(pipeline);

}

gst_element_link();方法把element連接起來,第一個參數是源element,第二個參數是目的element。這個連接決定了數據流向。而且只有同一個pipeline中的element才能建立連接,所以在調用此接口建立連接之前先把elements添加到pipeline中

5.設置視頻輸出屬性

g_object_set(source, "pattern", 0, NULL);//設置videotestsrc的屬性爲pattern,這個屬性值控制視頻的輸出,也可以試試不同的值看一下效果

g_object_set();方法接受一個用NULL結束的屬性名稱/屬性值得組成的對,而且可以一次同時修改多項屬性

對應的獲取屬性的接口是g_object_get();這裏沒有用到,感興趣的可以自己百度一下

6.開始播放 gst_element_set_state(pipeline, GST_STATE_PLAYING);,如果前面都沒錯就可以看到播放窗口了

7.異常處理,這一步不是必要的,調試時如果有異常發生可以幫助排查問題

GstBus *bus = gst_element_get_bus(pipeline);//獲取pipeline總線

GstMessage *msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);//阻塞,知道遇到異常或者播放結束

 if(msg != NULL){
        GError *err;
        gchar *debug_info;
        switch(GST_MESSAGE_TYPE(msg)){
            case GST_MESSAGE_ERROR://發生錯誤
                gst_message_parse_error(msg, &err, &debug_info);//解析錯誤信息
                g_printerr("Error received from element %s: %s \n", GST_OBJECT_NAME(msg->src), err->message);//打印錯誤信息
                g_printerr("Debugging information: %s\n", debug_info ? debug_info : "none");//打印調試信息
                g_clear_error(&err);
                g_free(debug_info);
                break;
            case GST_MESSAGE_EOS://播放結束
                g_printerr("End of stream reached \n");
                break;
            default:
                g_printerr("Unexpected message received. \n");
                break;
        }
        gst_message_unref(msg);//釋放msg資源
    }

8.釋放資源 

    gst_object_unref(bus);

    gst_element_set_state(pipeline, GST_STATE_NULL);

    gst_object_unref(pipeline);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章