GStreamer:管道在 gst-launch-1.0 命令中工作,但在 C++ 代码中不工作

GStreamer: Pipeline working in gst-launch-1.0 command, but not in c++ code

我的客户端上有一个管道 运行ning:

gst-launch-1.0 tcpclientsrc port=3344 host=10.0.0.7 ! tsdemux ! h264parse ! avdec_h264 ! autovideosink

效果很好。现在我正在尝试将它转换为 C++ 程序,该程序使用 qmlglsink 在 Qt 小部件中显示它。

我想出了以下测试代码,它对我有用:

GstElement *pipeline = gst_pipeline_new(NULL);
GstElement *src = gst_element_factory_make("videotestsrc",NULL);
GstElement *glupload = gst_element_factory_make("glupload",NULL);
GstElement *qmlglsink = gst_element_factory_make("qmlglsink",NULL);

g_assert(src && glupload && qmlglsink);

gst_bin_add_many(GST_BIN(pipeline), src, glupload, sink);
gst_element_link_many(src, glupload, sink, NULL);

现在我尝试以这种方式转换其他管道:

GstElement *pipeline = gst_pipeline_new(NULL);
GstElement *src = gst_element_factory_make("tcpclientsrc",NULL);
GstElement *demuxer = gst_element_factory_make("tsdemux",NULL);
GstElement *parser = gst_element_factory_make("h264parse",NULL);
GstElement *decoder = gst_element_factory_make("avdec_h264",NULL);
GstElement *glupload = gst_element_factory_make("glupload",NULL);
GstElement *qmlglsink = gst_element_factory_make("qmlglsink",NULL);

g_assert(src && demuxer && parser && decoder && glupload && qmlglsink);

g_object_set(G_OBJECT(src), "host", "10.0.0.7", NULL);
g_object_set(G_OBJECT(src), "port", 3344, NULL);

gst_bin_add_many(GST_BIN(pipeline), src, demuxer, parser, decoder, glupload, sink);
gst_element_link_many(src, demuxer, parser, decoder, glupload, sink, NULL);

但是当我运行后一个管道时,它什么都不做。没有错误,但也没有视频流。我想我错过了 link 命令的一些东西。请帮助并告诉我我做错了什么。

没有错误?您是否轮询管道总线以获取错误消息?你有 运行 带有 GST_DEBUG=3 的应用来检查提示吗?

但仅从观察来看 - 我假设 avdec_h264 将使用 I420 作为输出视频格式,而 qmlglsink 需要 RGBA 格式。所以你缺少一个颜色 space 转换器。因为无论如何你都要上传到 GL,我建议使用 glcolorconvert.

因此更改您的代码以创建如下管道:.. ! glupload ! glcolorconvert ! qmlglsink