如何在Cython中编写GStreamer插件

2024-06-16 09:20:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想设计一种新型的音频滤波器。目前,我使用GStreamer返回音频的缓冲区,而Cython则对其应用过滤器。然后我将结果发送回GStreamer。在

所有的东西都包装在python主代码中,GStreamer访问是使用pygst完成的。使用Cython来建立原型非常好,因为它在代码运行时会自动重新编译,而且非常高效。在

不过,我觉得如果我可以使用Cython文件来生成GStreamer本机插件(这些插件是用C编写的),这会更好。在

你对如何实现这一目标有什么想法吗?在


Tags: 文件代码插件过滤器目标音频原型cython
2条回答

Cython生成Python扩展模块,这些模块需要在Python上下文中初始化才能有用。我认为除非您与gstreamer开发人员合作,首先将Python模块支持添加到gstreamer中,否则您要实现的目标是不可能实现的。在

Cython主要是为生成Python扩展模块而设计的,并不是真正支持其他插件api。然而,如果你愿意手工调整输出,你也许可以得到一些合理的东西。在

例如,您可以手工编写一个小的C存根,将模块初始化为gstreamer插件:

#include "Python.h"
#include "gst_plugin.h"

static gboolean plugin_init (GstPlugin *plugin) {
    // initialize the extension module
    #if PY_MAJOR_VERSION < 3
        initgstreamer();
    #else
        PyInit_gstreamer();
    #endif

    // call into function exported from cython module
    return register_plugin(plugin);
}

GST_PLUGIN_DEFINE (
    GST_VERSION_MAJOR,
    GST_VERSION_MINOR,
    my_filter,
    "My filter plugin",
    plugin_init,
    VERSION,
    "LGPL",
    "GStreamer",
    "http://gstreamer.net/"
)

然后可以从cython模块导出register_plugin函数:

^{pr2}$

然而,这并不是全部。为了使其工作,您必须设法说服gstreamer将libpython加载到其进程中,因为cython甚至依赖它来初始化。您可能需要先初始化Python解释器,然后代码才能按您的要求运行。您需要为所有要使用的gstreamer插件注册api定义cython存根。如果其他人试图在同一个gstreamer进程中执行相同的操作,那么很可能会崩溃。在

尽管如此,一个更直接的方法可能是制作一个连接到Python代码的gstreamer插件,然后使用该插件访问cython模块。这样python嵌入是显式的,您将有机会在加载代码之前正确初始化python解释器。这样的插件对于其他人来说可能很有用,不管是使用cython还是使用ctypes模块来完成类似的项目。在

这样的插件实际上是一个颠倒的PyGST:它将Python作为库加载到GStreamer中,而不是将GStreamer作为库加载到Python中。可能有一些PyGST代码可以重复使用,但是每个进程只能包含一个Python,因此使用这种机制的多个模块都需要共享同一个Python解释器,就像将多个应用程序加载到Apache web服务器的mod_python模块时一样。在

相关问题 更多 >