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);