gstreamer - 无法链接 Gstreamer 元素
问题描述
我是 GStreamer 的新手,我遵循GStreamer 网站上的基本教程 2并尝试使其与本地 mp4 文件一起使用。我的问题是我无法链接“uridecodebin”和“autovideosink”,这是我的相关代码:
GstElement *pipeline, *source, *sink;
GstBus *bus;
GstMessage *msg;
GstStateChangeReturn ret;
/* Initialize GStreamer */
gst_init (&argc, &argv);
/* Create the elements */
source = gst_element_factory_make ("uridecodebin", "source");
sink = gst_element_factory_make ("autovideosink", "sink");
/* Create the empty pipeline */
pipeline = gst_pipeline_new ("pipeline");
if (!pipeline || !source || !sink) {
g_printerr ("Not all elements could be created.\n");
return -1;
}
/* Build the pipeline */
gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
if (gst_element_link (source, sink) != TRUE) {
g_printerr ("Elements could not be linked.\n");
gst_object_unref (pipeline);
return -1;
}
它总是返回 false gst_element_link (source, sink)
,但如果我简单地使用gst-launch-1.0 uridecodebin uri=file://MyPathToVideo/test.mp4 ! autovideosink
命令它工作得很好,我做错了什么?
非常感谢。
解决方案
尝试使用gst_parse_launch()
并给它你的管道。这种方式更短。而且我相信它会处理您的情况的一些特殊性。
您的方法不起作用的主要问题是uridecodebin
它没有暴露任何垫,因为那时它对您的 MP4 文件一无所知。所以它可以包含音频、视频,两者——或其他。正确的做法是实现延迟链接。
因此,不是直接链接它,而是在以下位置实现pad-added
信号uridecodebin
:
https ://gstreamer.freedesktop.org/documentation/gstreamer/gstelement.html?gi-language=c#GstElement::pad-added
然后在断开元素的情况下启动管道。
当扫描您的媒体文件并暴露可以链接的垫时,将触发此pad-added
信号。uridecodebin
如果它是您的视频板,您可以将其连接到autovideosink
.
gst_parse_launch()
如果我没记错的话,会自动为您执行此操作(至少这是gst-lauch-1.0
正在做的事情 - 不确定该特定功能是否也移至该 API)。
PS你开枪了。教程 2 没有使用uridecodebin
但更基本的元素。教程 3 将介绍动态管道。
推荐阅读
- visual-studio-code - VS Code 中的“运行单元需要安装 Jupyter 笔记本”错误
- javascript - 使用 axios 的多个请求而不等待所有请求都在数组列表中完成?
- vue.js - 我无法在 vue 中集成 js 查询文件
- linq-to-sql - LINQ 查询返回正确的计数但重复数据
- java - 无法在输出文件中逐行对文本文件输入进行排序
- postgresql - 锁定行时防止竞争条件
- javascript - 数据排序方法在javascript中不起作用
- android-studio - Android Studio main_activity.xml
- c++ - 构建 MongoDB 时出现 boost::date_time 错误:winapi 不是成员
- jvm - Firrtl 用大输入耗尽堆内存