Gstreamer : mastroskamux error : not linked
Gstreamer : mastroskamux error : not linked
我尝试播放以 h264 编码并与 matroskamux 混合的视频,但无法实现。我在嵌入式平台上,iMX6。
我的管道适用于 gst-lauch:
gst-launch-1.0 filesrc location=video.mkv ! matroskademux ! h264parse ! imxvpudec ! imxipuvideosink
我用 C 语言创建了它,但它不起作用。我删除了错误处理,我使用包含所有元素的结构 rep
:
rep->pipeline = gst_pipeline_new("pipeline");
rep->src = gst_element_factory_make("filesrc","source0");
rep->demux = gst_element_factory_make("matroskademux","demux0");
rep->queue = gst_element_factory_make("queue2","queue0");
rep->parser = gst_element_factory_make("h264parse","parser0");
rep->decoder = gst_element_factory_make("imxvpudec","dec0");
rep->sink = gst_element_factory_make("imxipuvideosink","sink0");
gst_bin_add_many (GST_BIN(rep->pipeline), rep->src, rep->demux, rep->queue, rep->parser, rep->decoder,rep->sink, NULL);
g_object_set(rep->src, "location", "video.mkv", NULL);
g_object_set(rep->sink, "use-vsync", TRUE, NULL);
gst_element_link_many(rep->src, rep->demux, rep->queue, rep->parser, rep->decoder, rep->sink, NULL);
g_print("start pipeline\n");
gst_element_set_state (rep->pipeline, GST_STATE_PLAYING);
g_main_loop_run (loop);
视频不显示,应用卡住。使用 GST_DEBUG=4 我得到了很多调试,但在最后几行:
0:00:00.168590667 577 0xe24c0 WARN matroskademux matroska-demux.c:4500:gst_matroska_demux_loop:<demux0> error: stream stopped, reason not-linked
0:00:00.168777333 577 0xe24c0 INFO GST_ERROR_SYSTEM gstelement.c:1835:gst_element_message_full:<demux0> posting message: GStreamer encountered a general stream error.
0:00:00.169084667 577 0xe24c0 INFO GST_ERROR_SYSTEM gstelement.c:1858:gst_element_message_full:<demux0> posted error message: GStreamer encountered a general stream error.
0:00:00.169268000 577 0xe24c0 INFO task gsttask.c:300:gst_task_func:<demux0:sink> Task going to paused
我试图强制链接解复用器的 pad,因为它有一个 "sometimes" 源 pad。
我不知道如何继续让它工作。
感谢您的帮助。
编辑:
日志文件 here。
链接问题,不知道怎么解决
问题是,当您尝试链接到 link 时,demux 在 NULL 状态下没有源垫。 Demux 在暂停状态下添加输出垫,因为此时它开始处理输入文件。因此,您不能简单地 link 它在开头然后开始。
您必须使用如下内容连接到多路分解器的 "on-pad-added" 事件:
g_signal_connect (rep->demux, "pad-added", G_CALLBACK (on_pad_added), rep->queue);
并编写适当的 on_pad_added
函数,如下所示:
void
on_pad_added (GstElement *element,
GstPad *pad,
gpointer data)
{
GstPad *sinkpad;
GstElement *queue = (GstElement *) data;
g_print ("Dynamic pad created, linking demuxer/decoder\n");
sinkpad = gst_element_get_static_pad (queue, "sink");
gst_pad_link (pad, sinkpad);
gst_object_unref (sinkpad);
}
我没有检查我的代码是否编译,但我相信你明白了。
您可能也对 this example 感兴趣。
顺便说一句,gst-launch 使用了一些支持这种延迟 linking 的智能机器。在代码中,您必须手动执行。
我尝试播放以 h264 编码并与 matroskamux 混合的视频,但无法实现。我在嵌入式平台上,iMX6。
我的管道适用于 gst-lauch:
gst-launch-1.0 filesrc location=video.mkv ! matroskademux ! h264parse ! imxvpudec ! imxipuvideosink
我用 C 语言创建了它,但它不起作用。我删除了错误处理,我使用包含所有元素的结构 rep
:
rep->pipeline = gst_pipeline_new("pipeline");
rep->src = gst_element_factory_make("filesrc","source0");
rep->demux = gst_element_factory_make("matroskademux","demux0");
rep->queue = gst_element_factory_make("queue2","queue0");
rep->parser = gst_element_factory_make("h264parse","parser0");
rep->decoder = gst_element_factory_make("imxvpudec","dec0");
rep->sink = gst_element_factory_make("imxipuvideosink","sink0");
gst_bin_add_many (GST_BIN(rep->pipeline), rep->src, rep->demux, rep->queue, rep->parser, rep->decoder,rep->sink, NULL);
g_object_set(rep->src, "location", "video.mkv", NULL);
g_object_set(rep->sink, "use-vsync", TRUE, NULL);
gst_element_link_many(rep->src, rep->demux, rep->queue, rep->parser, rep->decoder, rep->sink, NULL);
g_print("start pipeline\n");
gst_element_set_state (rep->pipeline, GST_STATE_PLAYING);
g_main_loop_run (loop);
视频不显示,应用卡住。使用 GST_DEBUG=4 我得到了很多调试,但在最后几行:
0:00:00.168590667 577 0xe24c0 WARN matroskademux matroska-demux.c:4500:gst_matroska_demux_loop:<demux0> error: stream stopped, reason not-linked
0:00:00.168777333 577 0xe24c0 INFO GST_ERROR_SYSTEM gstelement.c:1835:gst_element_message_full:<demux0> posting message: GStreamer encountered a general stream error.
0:00:00.169084667 577 0xe24c0 INFO GST_ERROR_SYSTEM gstelement.c:1858:gst_element_message_full:<demux0> posted error message: GStreamer encountered a general stream error.
0:00:00.169268000 577 0xe24c0 INFO task gsttask.c:300:gst_task_func:<demux0:sink> Task going to paused
我试图强制链接解复用器的 pad,因为它有一个 "sometimes" 源 pad。
我不知道如何继续让它工作。 感谢您的帮助。
编辑: 日志文件 here。 链接问题,不知道怎么解决
问题是,当您尝试链接到 link 时,demux 在 NULL 状态下没有源垫。 Demux 在暂停状态下添加输出垫,因为此时它开始处理输入文件。因此,您不能简单地 link 它在开头然后开始。
您必须使用如下内容连接到多路分解器的 "on-pad-added" 事件:
g_signal_connect (rep->demux, "pad-added", G_CALLBACK (on_pad_added), rep->queue);
并编写适当的 on_pad_added
函数,如下所示:
void
on_pad_added (GstElement *element,
GstPad *pad,
gpointer data)
{
GstPad *sinkpad;
GstElement *queue = (GstElement *) data;
g_print ("Dynamic pad created, linking demuxer/decoder\n");
sinkpad = gst_element_get_static_pad (queue, "sink");
gst_pad_link (pad, sinkpad);
gst_object_unref (sinkpad);
}
我没有检查我的代码是否编译,但我相信你明白了。
您可能也对 this example 感兴趣。
顺便说一句,gst-launch 使用了一些支持这种延迟 linking 的智能机器。在代码中,您必须手动执行。