Gstreamer T恤和多路复用器

时间:2016-01-13 05:52:42

标签: video-streaming gstreamer

以下Gstreamer管道在i.MX6平台上正常运行:

gst-launch-1.0 imxv4l2videosrc! imxvideoconvert_ipu deinterlace = 3! clockoverlay! tee name = tp tp。 ! queue2! imxg2dvideosink tp。 ! queue2! vpuenc_h264比特率= 5000! tee name = tp2 tp2。 ! queue2 max-size-buffers = 0 max-size-time = 0 max-size-bytes = 0! qtmux name = mux! filesink location =。/ test.mp4 tp2。 ! queue2 max-size-buffers = 0 max-size-time = 0 max-size-bytes = 0! rtph264pay! udpsink host = 192.168.30.151 port = 5000

但是,当我尝试使用Gstreamer API以下列方式将tp2链接到qtmux队列时:

    /* Build the gst_RecPipeline in streaming mode */
    gst_bin_add_many(GST_BIN(recPipe.pipeline), recPipe.tee2, recPipe.rtpQueue, recPipe.rtpPay, recPipe.udpSink, NULL);
    if (gst_element_link_many(recPipe.videoQueue, recPipe.vidEnc, recPipe.tee2, NULL) != TRUE ||
            gst_element_link_many(recPipe.videoMuxQueue, recPipe.mux, recPipe.fileSink, NULL) != TRUE ||
            gst_element_link_many(recPipe.rtpQueue, recPipe.rtpPay, recPipe.udpSink, NULL) != TRUE) {
        g_printerr("Elements could not be linked.\n");
        gst_object_unref(recPipe.pipeline);
        return -1;
    }

    /* Manually link the Tee, which has "Request" pads */
    tee_src_pad_template = gst_element_class_get_pad_template(GST_ELEMENT_GET_CLASS (recPipe.tee2), "src_%u");
    tee_1_pad = gst_element_request_pad(recPipe.tee2, tee_src_pad_template, NULL, NULL);
    gst_pad_set_caps(tee_1_pad, caps);
    q1_pad = gst_element_get_static_pad (recPipe.videoMuxQueue, "sink");
    gst_pad_set_caps(q1_pad, caps);
    tee_2_pad = gst_element_request_pad(recPipe.tee2, tee_src_pad_template, NULL, NULL);
    q2_pad = gst_element_get_static_pad (recPipe.rtpQueue, "sink");

    if ((err = gst_pad_link(tee_1_pad, q1_pad)) != GST_PAD_LINK_OK) {
        g_printerr("Tee2 for q1 could not be linked, err=%d.\n", err);
        gst_object_unref(recPipe.pipeline);
        return -1;
    }
    if (gst_pad_link(tee_2_pad, q2_pad) != GST_PAD_LINK_OK) {
        g_printerr("Tee2 for q2 could not be linked.\n");
        gst_object_unref(recPipe.pipeline);
        return -1;
    }

调用gst_pad_link(tee_1_pad,q1_pad)失败,错误为-4(GST_PAD_LINK_NOFORMAT)

如果我从管道中删除recPipe.mux,它可以正常工作。

为什么我无法将tee链接到多路复用器以及如何修复它?

2 个答案:

答案 0 :(得分:1)

问题实际上是尝试直接链接muxer而不使用请求板。在我正确实现与muxer请求板的链接之后,代码工作正常。

答案 1 :(得分:0)

qtmux和rtph264pay需要不同的h264流格式。 payloader想要'byte-stream',而qtmux想要'avc'。

我不知道vpuenc_h264提供的格式是什么,但您可以在两个分支上(在发球台之后)使用h264parse来转换h264流格式。

此外,复用器也有请求垫。因此,您应该像使用T恤一样请求水槽垫。