2016-01-13 192 views
0

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

gst-launch-1.0 imxv4l2videosrc! imxvideoconvert_ipu deinterlace = 3! clockoverlay! tee name = tp tp。 !队列2! imxg2dvideosink tp。 !队列2! 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主机= 192.168.30.151端口= 5000

然而,当我尝试链接TP2以下列方式使用的Gstreamer API来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以及如何解决它?

+0

可能相关的问题。播放和流式传输:gst-launch-1.0 filesrc location =/test.mp4! qtdemux! tee name = tp tp。 !队列2! h264parse! imxvpudec! imxg2dvideosink tp。 !队列2! rtph264pay! udpsink host = 192.168.30.151 port = 5000可以工作,但使用GStreamer API实现此管道的代码不会。它不能链接h264parse和imxvpudec –

回答

0

qtmux和rtph264pay需要不同的格式为他们的h264流。 payloader需要'字节流',而qtmux需要'avc'。

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

此外,该复用器也有请求垫。所以你应该要求水槽垫类似于你用三通做什么。

+0

rtph264pay可以同时使用byte-stream和avc。 vpuenc_h264提供avc。手动链接多路复用器请求板并没有改变任何东西,但是在每个分支中添加h264parse都有帮助。我的第二个播放问题呢? –

+0

哦,你说得对,rtp同时兼顾。 我不知道你的第二个问题,我不知道那些imx元素支持。无论如何,你可以启用GST_DEBUG并检查链接失败的原因。另外看链接返回将给你一些提示。 – thiagoss

1

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