【问题标题】:Gstreamer tee and muxGstreamer 三通和多路复用器
【发布时间】:2016-04-17 23:48:45
【问题描述】:

以下 Gstreamer 管道在 i.MX6 平台上工作正常:

gst-launch-1.0 imxv4l2videosrc ! imxvideoconvert_ipu deinterlace=3 !时钟叠加!三通名称= tp tp。 !队列2! imxg2dvideosink tp。 !队列2! vpuenc_h264 比特率=5000 !三通名称=tp2 tp2。 ! queue2 max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! qtmux 名称=mux !文件接收器位置=./test.mp4 tp2。 ! queue2 max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! rtph264pay! udpsink 主机=192.168.30.151 端口=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 链接到 mux 以及如何解决它?

【问题讨论】:

  • 可能相关的问题。播放和流式传输管道:gst-launch-1.0 filesrc location=/test.mp4 ! qtdemux !三通名称=tp tp。 !队列2! h264解析! imxvpudec! imxg2dvideosink tp。 !队列2! rtph264pay! udpsink host=192.168.30.151 port=5000 有效,但使用 GStreamer API 实现此管道的代码无效。它无法将 h264parse 与 imxvpudec 链接

标签: video-streaming gstreamer


【解决方案1】:

这个问题实际上是试图在不使用请求板的情况下直接链接多路复用器。在我正确实现与复用器请求板的链接后,代码工作正常。

【讨论】:

    【解决方案2】:

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

    我不知道 vpuenc_h264 提供什么格式,但您可以在两个分支上(在 tee 之后)使用 h264parse 在 h264 流格式之间进行转换。

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

    【讨论】:

    • rtph264pay 可以同时接受字节流和avc。 vpuenc_h264 提供 avc。手动链接多路复用器请求垫并没有改变任何东西,但是在每个分支中添加 h264parse 会有所帮助。我的第二个播放问题呢?
    • 哦,你是对的,rtp 两者兼得。我不知道你的第二个问题,我不知道那些 imx 元素支持什么。无论如何,您可以启用 GST_DEBUG 并检查链接失败的原因。同时查看链接返回会给你一些提示。
    猜你喜欢
    • 2012-11-02
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2014-07-05
    • 2016-04-30
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多