2013-12-21 9 views
6

新しいタイプのオーディオフィルタを試作したいと思います。現時点で私はGStreamerを使って私のオーディオのバッファを返し、Cythonはそれにフィルタを適用します。その後、結果をGStreamerに返します。CythonでGStreamerプラグインを書き込む方法

すべてがPythonのメインコードでラップされています.GStreamerのアクセスはpygstを使って行われます。 Cythonを使用してプロトタイプを作成すると、コード実行時に自動的に再コンパイルされるため、非常に効率的です。

しかし、GStreamerネイティブプラグイン(C言語で書かれています)を生成するためにCythonファイルを使用することができれば、これはさらに良いと感じています。

これを達成する方法について考えていますか?

答えて

5

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モジュールにロードされます。

+0

「それはあまりにも複雑ですよ!」 –

1

Cythonは、Pythonコンテキスト内で初期化する必要があるPython拡張モジュールを生成します。あなたが達成しようとしていることは、gstreamer開発者がPythonモジュールのサポートを最初にgstreamerに追加しない限り、可能ではないと思います。

関連する問題