2013-12-21 2 views
6

Я хочу прототип нового типа звукового фильтра. В настоящий момент я использую GStreamer для возврата буфера моего звука, а Cython - применить фильтр к нему. Затем я отправляю результат обратно в GStreamer.Как написать плагин GStreamer в Cython

Все обернуто в основной код python, доступ GStreamer осуществляется с использованием pygst. Использование Cython для прототипа отлично, потому что оно автоматически перекомпилируется при запуске кода и очень эффективно.

Однако я считаю, что это было бы еще лучше, если бы я мог использовать мои файлы Cython для создания родного плагина GStreamer (написанного на C).

У вас есть идея, как это можно достичь?

ответ

5

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/" 
) 

Вы можете экспортировать эту register_plugin функции из вашего Cython модуля:

cdef public int register_plugin(void *plugin): 
    # use the gstreamer API in here to register your plugin 

Однако, это еще не вся история. Чтобы это сработало, вам нужно как-то убедить gstreamer загрузить libpython в свой процесс, поскольку cython зависит от него даже для инициализации. Вероятно, вам нужно будет инициализировать интерпретатор Python немного раньше, чем ваш код будет работать по вашему желанию. Вам нужно будет определить заглушки cython для всех API-интерфейсов регистрации плагина gstreamer, которые вы хотите использовать. И если кто-то еще попытался сделать то же самое в том же процессе gstreamer, он, вероятно, все развалится.

Таким образом, при всем этом сказано, что более простой путь может состоять в том, чтобы сделать плагин gstreamer, который соединяется с кодом Python, а затем использовать этот плагин для доступа к вашему модулю cython. Таким образом, вложение python является явным, и вы сможете правильно инициализировать интерпретатор Python перед загрузкой кода. Такой плагин может быть полезен для других людей, которые пытаются выполнить аналогичные проекты с вашими, используя cython или модуль ctypes.

Такой плагин был бы фактически перевернутым PyGST: он загрузил бы Python в качестве библиотеки в GStreamer, вместо того, чтобы загружать GStreamer в качестве библиотеки в Python. Вероятно, есть какой-то код PyGST, который вы могли бы повторно использовать для этой цели, но у вас все еще есть ограничение на то, что каждый процесс может содержать только один Python, поэтому для использования нескольких модулей с использованием этого механизма все должны использовать один и тот же интерпретатор Python, несколько приложений загружаются в модуль mod_python для веб-сервера Apache.

+0

Иными словами, «Это слишком сложный чувак!». –

1

Cython генерирует модули расширения Python, которые необходимо инициализировать в контексте Python, чтобы быть полезными. Я думаю, что то, что вы пытаетесь выполнить, будет невозможно, если вы не будете работать с разработчиками gstreamer, чтобы сначала добавить поддержку модуля Python в gstreamer.