2024-09-26 17:42:04 发布
网友
我想设计一种新型的音频滤波器。目前,我使用GStreamer返回音频的缓冲区,而Cython则对其应用过滤器。然后我将结果发送回GStreamer。在
所有的东西都包装在python主代码中,GStreamer访问是使用pygst完成的。使用Cython来建立原型非常好,因为它在代码运行时会自动重新编译,而且非常高效。在
不过,我觉得如果我可以使用Cython文件来生成GStreamer本机插件(这些插件是用C编写的),这会更好。在
你对如何实现这一目标有什么想法吗?在
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函数:
register_plugin
然而,这并不是全部。为了使其工作,您必须设法说服gstreamer将libpython加载到其进程中,因为cython甚至依赖它来初始化。您可能需要先初始化Python解释器,然后代码才能按您的要求运行。您需要为所有要使用的gstreamer插件注册api定义cython存根。如果其他人试图在同一个gstreamer进程中执行相同的操作,那么很可能会崩溃。在
libpython
尽管如此,一个更直接的方法可能是制作一个连接到Python代码的gstreamer插件,然后使用该插件访问cython模块。这样python嵌入是显式的,您将有机会在加载代码之前正确初始化python解释器。这样的插件对于其他人来说可能很有用,不管是使用cython还是使用ctypes模块来完成类似的项目。在
ctypes
这样的插件实际上是一个颠倒的PyGST:它将Python作为库加载到GStreamer中,而不是将GStreamer作为库加载到Python中。可能有一些PyGST代码可以重复使用,但是每个进程只能包含一个Python,因此使用这种机制的多个模块都需要共享同一个Python解释器,就像将多个应用程序加载到Apache web服务器的mod_python模块时一样。在
mod_python
Cython生成Python扩展模块,这些模块需要在Python上下文中初始化才能有用。我认为除非您与gstreamer开发人员合作,首先将Python模块支持添加到gstreamer中,否则您要实现的目标是不可能实现的。在
Cython主要是为生成Python扩展模块而设计的,并不是真正支持其他插件api。然而,如果你愿意手工调整输出,你也许可以得到一些合理的东西。在
例如,您可以手工编写一个小的C存根,将模块初始化为gstreamer插件:
然后可以从cython模块导出
^{pr2}$register_plugin
函数:然而,这并不是全部。为了使其工作,您必须设法说服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
模块时一样。在相关问题 更多 >
编程相关推荐