我有以下管道可以正常工作:
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代码工作?
答案 0 :(得分:5)
解码器使用称为“有时垫”的东西,它基本上是在满足特定条件时出现的填充,在解码媒体的解码箱中。 gst-launch将自动执行此类操作,但在代码中,您需要注册一个回调,然后在该回调中链接pad。另见:GStreamer: how to connect dynamic pads
答案 1 :(得分:3)
正如@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);
}