gpt4 book ai didi

gstreamer - 为什么 gstreamer caps 阻塞管道

转载 作者:行者123 更新时间:2023-12-03 00:02:42 35 4
gpt4 key购买 nike

我正在尝试下面的基本管道。如果我在没有 caps 函数的情况下运行管道,它会直接通过(假设相同的 I/O 格式)。一旦我添加了上限,预卷就会开始,但视频不会继续到达接收器输出。

我编码错了吗?

谢谢艺术

    #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;
}

最佳答案

现在回答可能已经晚了,但您可能忘记在某些元素之间进行动态填充链接,并且您从未调用 on_pad_added 函数。我也遇到了同样的问题。

从那时起您是否尝试过添加它?例如,此行动态链接两个元素而不是 gst_element_link:

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

关于gstreamer - 为什么 gstreamer caps 阻塞管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9135911/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com