【问题标题】:Gstreamer audiofirfilterGstreamer 音频过滤器
【发布时间】:2020-04-02 17:24:27
【问题描述】:

我正在尝试在 gstreamer 管道中使用元素 audiofirfilter。暂时没有运气。

我搜索了文档和mailinglist 以获取示例,但不幸的是,由于缺少某些部分,我无法编译(我在嵌入式系统上)。

我的管道是

if (data.pipeline == NULL) {
        data.pipeline = gst_pipeline_new ("pipeline");
        data.fakesrc    = gst_element_factory_make("fakesrc", NULL);
        data.capsfilter = gst_element_factory_make("capsfilter", NULL);
        data.audioconvert   = gst_element_factory_make("audioconvert", NULL);
        data.audiofirfilter = gst_element_factory_make("audiofirfilter", NULL);
        data.alsasink   = gst_element_factory_make("alsasink", NULL);

        gst_bin_add_many (GST_BIN (data.pipeline), data.fakesrc, data.capsfilter, data.audioconvert, data.audiofirfilter, data.alsasink, NULL);

        if (!gst_element_link_many (data.fakesrc, data.capsfilter, data.audioconvert, data.audiofirfilter, data.alsasink, NULL) ) {
            qDebug() << "Error: not all elements could be linked!";
            return;
        }

        GstCaps* caps = gst_caps_new_simple("audio/x-raw",
                                                                                "format", G_TYPE_STRING, "S16LE",
                                                                                "rate", G_TYPE_INT, SAMPLING_FREQUENCY,
                                                                                "channels", G_TYPE_INT,2,
                                                                                "layout", G_TYPE_STRING, "interleaved",
                                                                                NULL);


        g_object_set(G_OBJECT(data.capsfilter), "caps", caps, NULL);


        g_object_set (G_OBJECT (data.fakesrc),
                                    "sync", TRUE,
                                    "signal-handoffs", TRUE,
                                    "sizemax",BUFFER_SIZE,
                                    "sizetype",2,NULL);

        gdouble filter_kernel[16] = {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

        GValueArray *va;
        va = g_value_array_new (1);

        GValue v = { 0, };
        g_value_init (&v, G_TYPE_DOUBLE);

        for (int i = 0; i < 16; i++) {
            g_value_set_double (&v, filter_kernel[i]);
            g_value_array_append (va, &v);
            g_value_reset (&v);
        }
        g_object_set (G_OBJECT (data.audiofirfilter), "kernel", va, NULL);
        g_object_set (G_OBJECT (data.audiofirfilter), "latency", (gint64) (16 / 2), NULL);

        g_value_array_free (va);


        g_signal_connect (data.fakesrc, "handoff", G_CALLBACK (SourceHandoffCallback), /*&data*/ this);

        GstBus *bus;
        bus = gst_pipeline_get_bus (GST_PIPELINE(data.pipeline));
        gst_object_unref (bus);
    }

我现在只想实现一个单一的脉冲响应。 管道根本不会播放。这是一个立体管道。

有没有人有一个不涉及 fft 的 audiofirfilter 应用程序的工作示例?逆fft?

谢谢

【问题讨论】:

    标签: c++ c gstreamer digital-filter


    【解决方案1】:

    我尝试了一个更简单的管道,这很有效:

    gst_init (NULL,NULL);
    
    cFusionDrumsPlayerData data;
    
    data.pipeline = gst_pipeline_new ("pipeline");
    data.src    = gst_element_factory_make("audiotestsrc", NULL);
    data.audiofirfilter = gst_element_factory_make("audiofirfilter", NULL);
    data.sink   = gst_element_factory_make("autoaudiosink", NULL);
    
    gst_bin_add_many (GST_BIN (data.pipeline), data.src, data.audiofirfilter, data.sink, NULL);
    
    if (!gst_element_link_many (data.src, data.audiofirfilter, data.sink, NULL) ) {
        return;
    }
    
    
    gdouble filter_kernel[16] = {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    
    GValueArray *va;
    va = g_value_array_new (1);
    
    GValue v = { 0, };
    g_value_init (&v, G_TYPE_DOUBLE);
    
    for (int i = 0; i < 16; i++) {
        g_value_set_double (&v, filter_kernel[i]);
        g_value_array_append (va, &v);
        g_value_reset (&v);
    }
    g_object_set (G_OBJECT (data.audiofirfilter), "kernel", va, NULL);
    g_object_set (G_OBJECT (data.audiofirfilter), "latency", (gint64) (16 / 2), NULL);
    
    g_value_array_free (va);
    
    gst_element_set_state (data.pipeline, GST_STATE_PLAYING);
    

    我认为问题可能是根源(fakesrc)

    【讨论】:

      猜你喜欢
      • 2022-08-05
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多