为什么gstreamer帽子会阻塞管道

时间:2012-02-03 21:41:56

标签: gstreamer

我正在尝试下面的基本管道。如果我在没有大写功能的情况下运行管道,它会直接通过(假设I / O格式相同)。一旦我添加了大写字母,前卷开始但视频不会继续到接收器输出。

我编码错了吗?

THX 艺术

    #include <gst/gst.h>
#include <glib.h>



static void
on_pad_added (GstElement *element,
              GstPad     *pad,
              gpointer    data)
{
  GstPad *sinkpad;
  GstElement *decoder = (GstElement *) data;

 g_print ("Dynamic pad created, linking out/in \n");

  sinkpad = gst_element_get_static_pad (decoder, "sink");

  gst_pad_link (pad, sinkpad);

  gst_object_unref (sinkpad);
}

int
main (int   argc,
      char *argv[])
{
  GMainLoop *loop;

  gboolean link_ok;

  GstElement *pipeline, *source, *decoder, *ffcs, *vidsc, *capsfout, *sink;
  GstBus *bus;
  GstCaps *caps;


  /* Initialisation */
  gst_init (&argc, &argv);

  loop = g_main_loop_new (NULL, FALSE);

  /* Create gstreamer elements */
  pipeline = gst_pipeline_new ("video-player");
  source   = gst_element_factory_make ("filesrc",           "file-source");
  decoder  = gst_element_factory_make ("decodebin2",        "dec-bin2");
  ffcs     = gst_element_factory_make ("ffmpegcolorspace",  "ffcs");
  vidsc    = gst_element_factory_make ("videoscale",        "vidsc");
  capsfout = gst_element_factory_make ("capsfilter",        "capsfout");
  sink     = gst_element_factory_make ("filesink",          "vidout");

  if (!pipeline || !source || !decoder || !ffcs || !vidsc || !capsfout || !sink) {
    g_printerr ("One element could not be created. Exiting.\n");
    return -1;
  }

  /* we set the input/output filename to the source element */
  g_object_set (G_OBJECT (source), "location", argv[1], NULL);
  g_object_set (G_OBJECT (sink), "location", argv[2], NULL);

  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));

  gst_bin_add_many (GST_BIN (pipeline),
                    source, decoder, ffcs, vidsc, capsfout, sink, NULL);


  /* we link the elements together */
   gst_element_link (source, decoder);
   gst_element_link (decoder, ffcs);
   gst_element_link (ffcs, vidsc);

  caps = gst_caps_new_simple("video/x-raw-yuv",
                      "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'),
                      "width", G_TYPE_INT, 384,
                      "height", G_TYPE_INT, 216,
                      "framerate", GST_TYPE_FRACTION, 25, 1,
                      NULL);

  link_ok = gst_element_link_filtered(vidsc,sink,caps);
  gst_caps_unref (caps);

  if (!link_ok) {
      g_warning ("Failed to link vidsc to sink!");
    }else{
        g_print("seems ok, no error reported?\n");
    }


  /* Set the pipeline to "playing" state*/
  g_print ("Now playing: %s\n", argv[1]);
  gst_element_set_state (pipeline, GST_STATE_PLAYING);


  /* Iterate */
  g_print ("Running...\n");
  g_main_loop_run (loop);


  /* Out of the main loop, clean up nicely */
  g_print ("Returned, stopping playback\n");
  gst_element_set_state (pipeline, GST_STATE_NULL);

  g_print ("Deleting pipeline\n");
  gst_object_unref (GST_OBJECT (pipeline));

  return 0;
}

2 个答案:

答案 0 :(得分:3)

回答可能会迟到,但您可能忘记在某些元素之间执行动态pad链接,而您永远不会调用on_pad_added函数。我遇到了同样的问题。

从那时起你有没有试过添加它?例如,这一行动态链接两个元素而不是gst_element_link

g_signal_connect (decoder, "pad-added", G_CALLBACK (on_pad_added), ffcs);

答案 1 :(得分:1)

您需要什么原因才能使用封盖式过滤器?仅限制您需要的属性。例如。你设置一个帧速率,但在封顶过滤器之前没有videorate元素。如果您不关心帧速率(例如只想强制大小),请从您在capsfilter上设置的大写字母中删除帧速率。