GStreamer:上限谈判失败

时间:2016-06-01 18:22:58

标签: c++ gstreamer

我在连接两个元素时遇到问题:avdec_h264和avenc_mpeg4。我认为这些元素无论如何都无法协商数据的功能。

我用gst-launch测试了我的管道:

gst-launch-1.0 rtspsrc location="rtsp://camera" ! rtph264depay ! h264parse ! avdec_h264 ! avenc_mpeg4 ! fakesink

它运作良好。

当我使用我的应用程序实现管道时:

    pipeline_ = gst_pipeline_new("default");

    if (!pipeline_)
    {
        return false;
    }

    receiver_ = gst_element_factory_make("rtspsrc",      "receiver");
    demuxer_  = gst_element_factory_make("rtph264depay", "demuxer");
    parser_   = gst_element_factory_make("h264parse",    "parser");
    decoder_  = gst_element_factory_make("avdec_h264",   "decoder");
    encoder_  = gst_element_factory_make("avenc_mpeg4,   "encoder");
    output_   = gst_element_factory_make("fakesink",     "output");

    if (!receiver_ || !demuxer_ || !parser_ || 
        !decoder_  || !encoder_ || !output_)
    {
        return false;
    }

    g_object_set(GST_OBJECT(receiver_), "location", "rtsp://camera", nullptr);
    // On this signal source pad of the receiver is being connected to
    // the sink pad of the demuxer.
    g_signal_connect(receiver_, "pad-added", G_CALLBACK(on_pad_added), this);

    gst_bin_add_many(GST_BIN(pipeline_), receiver_, demuxer_, parser_,
                     decoder_, encoder_, output, nullptr);

    if (!gst_element_link_many(demuxer_, parser_, decoder_,
                               encoder_, output_, nullptr))
    {
        return false;
    }

一切都成功链接。所有元素都将状态更改为PLAYING,但我什么也得不到:我没有在管道总线上获得GST_MESSAGE_STREAM_START。

以下是gst-launch和我的应用程序的图表: Graph generated by gst-launch Graph generated by my application

如果我将avenc_mpeg4更改为videoconvert元素(不是编码器),一切都会正常工作。如果我放一个其他编码器,我仍然会有当前的问题。

可能我不知道如何使用编码器的一些特殊事项。但我找不到解决方案。

谢谢。

2 个答案:

答案 0 :(得分:0)

几点:

  1. 上面列出的代码应列出decodebin的pad添加消息。如果代码可以正常工作(我可能会把完整的代码放在gist和链接上),我感到很惊讶。请参阅https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-pads.html
  2. 在解码器和编码器之间插入视频转换。

答案 1 :(得分:0)

你在哪里将收货人与拆分人联系起来?这是我理解所需要的。