Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video Gstreamer:mastroskamux错误:未链接_Video_Gstreamer_Matroska - Fatal编程技术网

Video Gstreamer:mastroskamux错误:未链接

Video Gstreamer:mastroskamux错误:未链接,video,gstreamer,matroska,Video,Gstreamer,Matroska,我试着播放一段用h264编码并与matroskamux混合的视频,但我没能做到。我在嵌入式平台上,一个iMX6 我的管道与gst lauch一起工作: gst-launch-1.0 filesrc location=video.mkv ! matroskademux ! h264parse ! imxvpudec ! imxipuvideosink 我用C语言创建了它,但它不工作。我删除了错误处理,我使用包含所有元素的结构rep: rep->pipeline = gst_pipeline

我试着播放一段用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
0:00:00.168590667 577 0xe24c0警告matroskademux matroska demux.c:4500:gst_matroska_demux_循环:错误:流停止,原因未链接
0:00:00.168777333 577 0xe24c0信息GST\u错误\u系统gstelement.c:1835:GST\u元素\u消息\u完整:发布消息:GStreamer遇到一般流错误。
0:00:00.169084667 577 0xe24c0信息GST\u错误\u系统gstelement.c:1858:GST\u元素\u消息\u完整:发布的错误消息:GStreamer遇到一般流错误。
0:00:00.169268000 577 0xe24c0信息任务gsttask.c:300:gst_任务_func:任务将暂停
我试图强制链接解复用器的pad,因为它有一个“有时”源pad

我不知道如何继续使它工作。 谢谢你的帮助

编辑: 日志文件。
这是一个链接问题,我不知道如何解决。

问题是,当您尝试链接时,demux没有处于空状态的源焊盘。Demux在暂停状态下添加输出焊盘,因为此时它开始处理输入文件。因此,您不能简单地在开始时链接它,然后再开始

您必须通过以下方式连接到解复用器的“在键盘上添加”事件:

g_signal_connect (rep->demux, "pad-added", G_CALLBACK (on_pad_added), rep->queue);
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);
}
并在添加的函数上写入适当的
,如下所示:

g_signal_connect (rep->demux, "pad-added", G_CALLBACK (on_pad_added), rep->queue);
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);
}
我没有检查我的代码是否编译,但我相信你明白了

你可能也对这本书感兴趣


顺便说一句,gst的发布使用了一些支持这种延迟链接的智能机器。在代码中,您必须手动执行此操作。

可能大写字母不匹配。也许matroska还有更多的足迹?尝试GST_DEBUG=5并将日志重定向到文件。有很多东西可以解释发生了什么。我可以查看日志。@peper0谢谢你的回答,我用日志编辑了我的文章。在你记录的运行过程中,你的管道是什么?对不起,我以为是gst发布的日志。现在我看到它是从你附加的代码。