加载静态链接的GStreamer插件

时间:2014-01-27 20:27:04

标签: static-libraries gstreamer

我正在研究使用GStreamer 0.10.36的嵌入式系统的软件。我的目标是保持软件在闪存空间方面尽可能小,所以我想静态链接我需要的GStreamer插件。根据核心参考手册:

  

“有一些选项可以将插件静态链接到应用程序甚至使用   没有插件存储库的GStreamer,在这种情况下gst_plugin_load()   可能需要将插件带入内存。 “

不幸的是,我不清楚我需要做些什么来将插件带入内存,以便后续调用gst_element_factory_make()成功完成。

我正在做以下事情:

  • 使用--enable-static--disable-registry设置构建GStreamer。
  • 将静态库链接到我的应用程序
  • 致电gst_element_factory_make()创建元素

现在我只为一个插件(tcpclientsink)执行此操作,作为一个实验。我必须编辑该插件的Makefile以删除--disable-static语句以获取要构建的libgsttcp.a文件。我认为图书馆很好,但我不确定是否有一个很好的方法来验证它。 gst-inspect似乎不适用于静态库。

注意:如果我调用load_gst_plugin(/path/to/libgsttcp.a),由于ELF标头无效,GStreamer无法加载插件。

如何加载静态链接的GStreamer库?

2 个答案:

答案 0 :(得分:3)

我制作了一个应用程序,其中所有插件都在应用程序内编译(因此它是自包含的)...也许这是另一个选项,或者你真的需要链接到库吗?

我得到了我用来编译共享库中插件的常用代码(plugin.c和plugin.h)。我添加了一个包含静态注册码的额外包装器头

static gboolean myplugin_init(GstPlugin * plugin)
{
gboolean ret;
gst_controller_init(NULL, NULL);

GST_DEBUG_CATEGORY_STATIC (gst_myplugin_debug);
GST_DEBUG_CATEGORY_INIT(gst_myplugin_debug, "myplugin", 0, "description");
ret = gst_element_register(plugin, "myplugin", GST_RANK_NONE, GST_TYPE_MECIMOTION);

return ret;
}


void gstmyplugins_register_static()
{
gst_plugin_register_static(
    GST_VERSION_MAJOR,
    GST_VERSION_MINOR,
    "myplugin",
    "description",
    myplugin_init,
    "0.0.1",
    "LGPL",
    "myplugins",
    "GStreamer",
    "http://gstreamer.net/");
gst_plugin_register_static(
...
}

然后在我的应用程序的代码中,我称之为注册:

gstmyplugins_register_static();

然后继续

gst_element_factory_make("myplugin", NULL);

希望这会有所帮助。

答案 1 :(得分:1)

在GStreamer开发人员的帮助下,我找到了答案....不要使用版本0.10.36。 :)

基本上,在以后的版本中添加/修复了构建静态插件库的能力。为了让它在0.10.36中工作,我不得不将端口更改从GStreamer SDK和GStreamer 1.x支持到0.10.36。事情仍然是一项正在进行中的工作,但我能够建立libgstcoreelements.和静态链接。如果我还没有构建0.10.36的修改版本,我可能会使用SDK。

<强>更新

我创建了我正在使用的所有库的静态版本。我的GStreamer库现在是0.10.36,SDK和1.2.2之间的混合体,但它可以工作。我不会为任何人推荐这个解决方案。使用SDK或版本1.x。