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


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