在gstreamer中动态添加和删除tee的队列

时间:2015-01-02 10:26:40

标签: gstreamer

我已经为相机直播和录制同时编写了gstreamer代码。

我的管道看起来像这样:

                 /  [ queue1 | videosink ]           
v4l2src | tee         
                 \  [ queue2 | filesink ]        

目前,直播和文件录制都在协同工作。

现在我需要只用一个队列即queue1(实时流队列)来启动管道。过了一段时间我需要添加记录队列并动态删除它。

我的工作代码如下:

    pipeline = gst_pipeline_new ("rv_camera");

    /*Create source element. We use mfw_v4lsrc from Freescale as source */

    source= gst_element_factory_make (GSTREAMER_SOURCE,"camera-source");
    g_object_set(G_OBJECT(source),"device",camDeviceName, (char *)0);

    /*Set default properties of mfw_v4lsrc */
    g_object_set(G_OBJECT(source),"capture-width", CAMERA_CAPTURE_WIDTH,
                                  "capture-height", CAMERA_CAPTURE_HEIGHT,
                                  "sensor-width", CAMERA_SENSOR_WIDTH,
                                  "sensor-height", CAMERA_SENSOR_HEIGHT,
                                  "preview", CAMERA_PREVIEW_DISPLAY,
                                  "preview-width",CAMERA_PREVIEW_WIDTH,
                                  "preview-height",CAMERA_PREVIEW_HEIGHT,
                                  "fps-n",CAMERA_FRAMERATE,
                                  "rotate",mirror_effect,
                                  (char *)0);


    /* Tee that copies the stream to multiple outputs */
        tee = gst_element_factory_make("tee", "tee");

        /* Queue creates new thread for the stream */
        screen_queue = gst_element_factory_make("queue", "screen_queue");

    /*Create sink element. We use mfw_v4lsink from Freescale as sink. fbdevsink is not used as
      it directly writes into framebuffer which is not desired*/
    sink= gst_element_factory_make (GSTREAMER_SINK,"video-output");

    capture_queue = gst_element_factory_make("queue", "capture_queue");

    encoder = gst_element_factory_make("mfw_vpuencoder", "encoder");
    g_object_set(G_OBJECT(encoder),"codec-type",0,
                                   "mirror-direction",0,
                                    (char *)0);

    clockoverlay = gst_element_factory_make("clockoverlay", "Timestamp");
    g_object_set(G_OBJECT(clockoverlay),"time-format","%R %d-%b-%Y", (char *)0);

    avimux = gst_element_factory_make("avimux", "avimux");

    filesink = gst_element_factory_make("filesink", "file-output");
    g_object_set(G_OBJECT(filesink),"location","/KPIT/OBITS/Blackbox/OBITS-SCNLog.avi", (char *)0);



    /* Check if all elements are created or not*/
    if (!pipeline || !source || !tee || !screen_queue || !sink || !capture_queue || !clockoverlay || !encoder || !avimux || !filesink) {
        LOGERR((TEXT("GstreamerStream :: camInit: 1 One or more element(s) could not be created .... logerr\n")));
        return CAM_STATUS_INIT_FAIL;
    }

    /* we add all elements into the pipeline */
    gst_bin_add_many (GST_BIN (pipeline),source,tee,screen_queue, sink, capture_queue,clockoverlay,encoder,avimux,filesink, (char *)0);

    /* we link the elements together */
   if( gst_element_link_many( source, tee, NULL ) &&  gst_element_link_many( tee,screen_queue,sink, NULL ) &&
           gst_element_link_many( tee,capture_queue,clockoverlay,encoder,avimux,filesink, NULL ))
   {
         bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));

        /*Add watch to look for error events */
        gst_bus_add_watch(bus, process_events, this);

        gst_object_unref(bus);

        }
        gst_element_set_state (pipeline, GST_STATE_PLAYING);

请让我知道方式,我可以动态添加或删除任何队列。

如果有人可以提供与此相关的示例代码,我将非常感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

将发球台保持在管道中,您可以在播放期间随时从发球台请求/释放打击垫。请求填充并将新元素添加到管道,链接它们,并将它们设置为播放。完成后,取消链接此分支并记住向其发送EOS以使录制正确完成。从文件链接收到EOS消息后,您可以关闭,删除和取消您取消链接的分支。

如果你使用0.10(不要使用它,移动到1.0),那么你可能需要在添加它之后将一个段事件发送到新的分支。