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