Gstreamer1.0: подключить декодеин к видеоконверту

У меня есть следующий трубопровод, который отлично работает:

gst-launch-1.0 -v filesrc location = / home / Videos / sample_h264.mov! decodebin! видеоконвертер! autovideosink

Я хочу написать программу на C, чтобы сделать то же самое. Поэтому я перевел предыдущий конвейер на следующий код:

pipeline = gst_pipeline_new ("video_pipeline"); if (!pipeline) { g_print("Failed to create the pipeline\n"); return -1; } bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); watch_id = gst_bus_add_watch (bus, bus_call, loop); gst_object_unref (bus); source = gst_element_factory_make ("filesrc", "file-source"); decoder = gst_element_factory_make ("decodebin", "standard-decoder"); converter = gst_element_factory_make ("videoconvert", "converter"); sink = gst_element_factory_make ("autovideosink", "video-sink"); if (!source || !decoder || !converter || !sink) { g_print("Failed to create one or more pipeline elements\n"); return -1; } g_object_set(G_OBJECT(source), "location", file_name, NULL); gst_bin_add_many (GST_BIN (pipeline), source, decoder, converter, sink, NULL); if (!gst_element_link_many (source, decoder, converter, sink, NULL)) { g_print ("Failed to link some elements!\n"); return -1; } /* run */ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); if (ret == GST_STATE_CHANGE_FAILURE) { GstMessage *msg; g_print ("Failed to start up pipeline!\n"); /* check if there is an error message with details on the bus */ msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0); if (msg) { GError *err = NULL; gst_message_parse_error (msg, &err, NULL); g_print ("ERROR: %s\n", err->message); g_error_free (err); gst_message_unref (msg); } return -1; } 

Но я получаю ошибку, когда пытаюсь подключить декодер к конвертеру. Почему он отлично работает с командной строкой, но не с кодом C?

Decodebin использует что-то, называемое «иногда-pad», которое в основном представляет собой пэд, который будет отображаться при выполнении определенного условия, в случае декодированных бинов, который декодируется носителем. gst-launch будет делать это автоматически, но в коде вам нужно зарегистрировать обратный вызов, а затем связать блок в этом обратном вызове. См. Также: GStreamer: как подключить динамические колодки

Как сказал @HarvardGraff, decodebin не имеет статических src пэдов (см. gst-inspect decodebin ).

Но вы также можете использовать стартовые строки в своем приложении. Таким образом, GStreamer должен обрабатывать все ссылки):

 GstError *error = NULL; GstElement *pipeline = gst_parse_launch("filesrc name=src ! decodebin ! videoconvert ! autovideosink", &error); if (!error) { GstElement filesrc = gst_bin_get_by_name(GST_BIN(pipeline), "src"); g_object_set(filesrc, "location", "/home/Videos/sample_h264.mov", NULL); }