Cythonは主にPython拡張モジュールを生成するために設計されており、他のプラグインAPIをサポートするよう実際には設計されていません。しかし、出力を手で調整する場合は、合理的なものを得ることができます。
cdef public int register_plugin(void *plugin):
# use the gstreamer API in here to register your plugin
:
#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
関数をエクスポートすることができます。たとえば
、あなたはGStreamerのプラグインとして、あなたのモジュールを初期化するために、小さなCスタブを手で書くことができます
しかし、これはすべての話ではありません。これがうまくいくためには、gstreamerがlibpython
をプロセスにロードするように何とか説得しなければなりません。なぜなら、cythonはそれを初期化するだけであるからです。 Pythonインタプリタを少し初期化してコードを実行する必要があるでしょう。使用するすべてのgstreamerプラグイン登録APIのためにcythonスタブを定義する必要があります。他の誰かが同じgstreamerプロセスで同じことをしようとすると、おそらくすべてが崩壊してしまうでしょう。
これで、より簡単な方法は、Pythonコードに橋渡しするgstreamerプラグインを作成し、そのプラグインを使用してcythonモジュールにアクセスすることです。こうすることで、Pythonの埋め込みが明示的になり、コードを読み込む前にPythonインタプリタを適切に初期化することができます。このようなプラグインは、cythonやモジュールを使用していても、あなたと似たプロジェクトをやろうとしている他の人にとって役に立ちます。
このようなプラグインは効果的には逆のPyGSTになります.GStreamerをライブラリとしてPythonにロードするのではなく、PythonをライブラリとしてGStreamerにロードします。この目的のために再利用できるPyGSTコードがいくつかありますが、各プロセスには1つのPythonしか含めることができないため、このメカニズムを使用する複数のモジュールはすべて同じPythonインタプリタを共有する必要があります複数のアプリケーションがApache Webサーバー用のmod_python
モジュールにロードされます。
「それはあまりにも複雑ですよ!」 –