gpt4 book ai didi

callback - GStreamer:如何连接动态垫

转载 作者:行者123 更新时间:2023-12-04 14:17:48 24 4
gpt4 key购买 nike

我正在尝试使用 GStreamer 从文件播放 MP4 视频。我设法使用 playbin2 并从命令提示符使用以下命令播放文件:

gst-launch filesrc location=bbb.mp4 ! decodebin2 ! autovideosink

我期待将来我需要创建更复杂的管道,因此我试图对管道进行“编程”。在我的程序中,我试图复制上面的管道,但是我有一个问题,我怀疑与将 decodebin2 的动态或“有时”源焊盘连接到自动视频接收器有关。我使用这些元素只是为了让事情尽可能简单。
static void on_new_decoded_pad(GstElement* object,
GstPad* arg0,
gboolean arg1,
gpointer user_data)
{
// dynamically connect decoderbin2 src pad to autovideosink sink pad
}

static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
// handle bus messages
}

int main(int argc, char *argv[])
{
GMainLoop *loop;
GstElement *pipeline, *source, *decodebin, *videosink;
GstBus *bus;

gst_init (&argc, &argv);
loop = g_main_loop_new (NULL, FALSE);

pipeline = gst_pipeline_new ("pipeline");
source = gst_element_factory_make("filesrc", "source");
decodebin = gst_element_factory_make("decodebin2", "decodebin");
videosink = gst_element_factory_make("autovideosink", "videosink");

/* check elements were created successfully */
if (!pipeline || !source || !decodebin || !videosink) {
// Failed to create element. Exit Program
return -1;
}

/* apply properties to elements before adding to pipeline */
gchar * filename = "bbb.mp4";
g_object_set(G_OBJECT(source), "location", filename, NULL);

/* add a message handler */
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
gst_bus_add_watch (bus, bus_call, loop);
gst_object_unref (bus);

/* add elements to pipeline (and bin if necessary) before linking them */
gst_bin_add_many(GST_BIN (pipeline),
source,
decodebin,
videosink,
NULL);

gst_element_link_pads(source, "src", decodebin, "sink");

/* decodebins src pad is a sometimes pad - it gets created dynamically */
g_signal_connect(decodebin, "new-decoded-pad", G_CALLBACK(on_new_decoded_pad), videosink);

/* run pipeline */
gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING);

g_main_loop_run(loop);

gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL);
gst_object_unref (pipeline);

return 0;
}

当我运行这个程序时,我希望通过回调函数调用 on_new_decoded_pa​​d,该函数在行中设置:
g_signal_connect(decodebin, "new-decoded-pad", G_CALLBACK(on_new_decoded_pad), videosink);

并允许我适本地连接焊盘。但它永远不会被调用。事实上,程序似乎完全通过然后退出(主循环什么也不做)。

如果有人能指出我在回调方面做错了什么,或者解释为了让本示例使用提供的元素播放 mp4 还需要做什么,我将不胜感激。

问候。

最佳答案

on_new_decoded_pa​​d 已被弃用,使用“pad- added”代替。
我还有一个关于 decodebin 2 的问题,你可以在这里找到:GStreamer force decodebin2 output type

关于callback - GStreamer:如何连接动态垫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8014498/

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