在做的一个项目需要显示录制同时进行,且在需要的时候停止录制,但是显示不得中断。参考链接中有国外的解决方案,但是其中有些方法在gstreamer-1.0中并没有。经过几天的修改,最终实现,部分代码如下:
拦截eos消息的代码:
gboolean drop_eos_probe(GstPad* pad, GstPadProbeInfo *info, gpointer data){
gboolean ret = TRUE;
static int called = 0;
GstEvent * event = gst_pad_probe_info_get_event(info);
switch(GST_EVENT_TYPE(event)){
case GST_EVENT_EOS:
called++;
if(called == 1){
g_print("removing recording bin!\n");
GstElement *rec_bin = gst_bin_get_by_name(GST_BIN(gst_app.pipeline), "myfilebin");
GstElement *tee = gst_bin_get_by_name(GST_BIN(gst_app.pipeline), "mytee");
GstElement *fqueue = gst_bin_get_by_name(GST_BIN(gst_app.pipeline), "myfilequeue");
GstPad *srcpad = gst_element_get_static_pad(tee, "src_1");
GstPad *sinkpad = gst_element_get_static_pad(fqueue, "sink");
//gst_pad_set_blocked(srcpad, TRUE);
GST_OBJECT_FLAG_SET(srcpad, GST_PAD_FLAG_BLOCKED);
gst_pad_unlink(srcpad, sinkpad);
gst_element_remove_pad(tee, srcpad);
gst_bin_remove(GST_BIN(gst_app.pipeline), rec_bin);
//gst_pad_set_blocked(srcpad, FALSE);
GST_OBJECT_FLAG_UNSET(srcpad, GST_PAD_FLAG_BLOCKED);
gst_element_set_state(GST_ELEMENT(rec_bin), GST_STATE_NULL);
ret = FALSE;
}else{
g_print("caught %d Not Dropping!\n", called);
}
break;
}
g_print("event : %d\n", GST_EVENT_TYPE(event));
return ret;
}
需要注意的是:
1、函数参数定义不一样,1.0的版本需要改成如下的函数:
gboolean drop_eos_probe(GstPad* pad, GstPadProbeInfo *info, gpointer data)
2、gst_pad_set_blocked方法在1.0版本中已经没有,我查询百度也没有发现有此方法。因此需要使用另外的方法代替:
//gst_pad_set_blocked(srcpad, TRUE);
GST_OBJECT_FLAG_SET(srcpad, GST_PAD_FLAG_BLOCKED);
3、src和sink必须使用gst_element_link方法链接的pad,也就是这两个对象要注意别弄错:
GstPad *srcpad = gst_element_get_static_pad(tee, "src_1");
GstPad *sinkpad = gst_element_get_static_pad(fqueue, "sink");
4、设置GST_STATE_NULL状态的对象必须是定义的一个完整的分支链接:
gst_element_set_state(GST_ELEMENT(rec_bin), GST_STATE_NULL);
5、probe的事件add方法不一样:
gst_pad_add_probe(gst_element_get_static_pad(app->fileencoder, "src"), GST_PAD_PROBE_TYPE_EVENT_BOTH, G_CALLBACK(drop_eos_probe), app->pipeline, NULL);
目前使用此方法会有警告信息,测试过程中有一次视频卡住。其他都正常。后续会改进。
参考链接:http://gstreamer-devel.966125.n4.nabble.com/Handling-EOS-in-a-branched-pipeline-td2965563.html