控制filesink录制

在做的一个项目需要显示录制同时进行,且在需要的时候停止录制,但是显示不得中断。参考链接中有国外的解决方案,但是其中有些方法在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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值