Kurento:无法应用GStreamer“;audiocheblimit“+&引用;“切刀”;

Kurento:无法应用GStreamer“;audiocheblimit“+&引用;“切刀”;,gstreamer,kurento,Gstreamer,Kurento,下面是我的代码块,我正试图使用它从传入的mediapipeline中去除噪声 VADCustomFilterImpl::VADCustomFilterImpl(const boost::property_tree::ptree & config,std::shared_ptr <MediaPipeline > mediaPipeline) :FilterImpl (config,std::dynamic_pointer_cast <MediaObjectImpl>

下面是我的代码块,我正试图使用它从传入的mediapipeline中去除噪声

VADCustomFilterImpl::VADCustomFilterImpl(const boost::property_tree::ptree & config,std::shared_ptr <MediaPipeline > mediaPipeline) :FilterImpl (config,std::dynamic_pointer_cast <MediaObjectImpl> (mediaPipeline))
        {
            /* audio cheb limit - to remove noise */
            //GST_WARNING("------------------------audiocheblimit");
            g_object_set(element, "filter-factory", "audiocheblimit", NULL);
            g_object_get(G_OBJECT(element), "filter", &audiocheblimitfilter, NULL);

            if (audiocheblimitfilter == NULL) {
            throw KurentoException(MEDIA_OBJECT_NOT_FOUND, "MediaObject not found: audiocheblimitfilter");
            }

            g_object_set(G_OBJECT(audiocheblimitfilter), "mode", "low-pass", NULL);
            g_object_set(G_OBJECT(audiocheblimitfilter),"cutoff", 700, NULL);

            //GST_WARNING("----------------cutter");
            /*Cutter*/
            g_object_set(element, "filter-factory", "cutter", NULL);
            g_object_get(G_OBJECT(element), "filter", &cutterfilter, NULL);

            if (cutterfilter == NULL) {
                throw KurentoException(MEDIA_OBJECT_NOT_FOUND, "MediaObject not found: cutterfilter");
            }

            g_object_set(G_OBJECT(cutterfilter), "threshold-dB", -40.0, NULL);
            g_object_set(G_OBJECT(cutterfilter), "run-length", 500000000, NULL);

            //GST_WARNING("~~~~~~~~~~~~~~~~~~~~audiocheblimit+cutter");
            bus_handler_id = 0;

            g_object_unref(audiocheblimitfilter);
            g_object_unref(cutterfilter);
        }
服务器日志:

(kurento-media-server:27765): GLib-GObject-CRITICAL **: g_object_set: assertion 'G_IS_OBJECT (object)' failed
(kurento-media-server:27765): GStreamer-CRITICAL **: gst_bin_add: assertion 'GST_IS_ELEMENT (element)' failed
(kurento-media-server:27765): GStreamer-CRITICAL **: gst_element_get_static_pad: assertion 'GST_IS_ELEMENT (element)' failed
(kurento-media-server:27765): GStreamer-CRITICAL **: gst_ghost_pad_new_from_template: assertion 'GST_IS_PAD (target)' failed
(kurento-media-server:27765): GLib-GObject-CRITICAL **: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
(kurento-media-server:27765): GStreamer-CRITICAL **: gst_element_add_pad: assertion 'GST_IS_PAD (pad)' failed
[31;1mSegmentation fault[0m (thread [33;1m140450597959424[0m, pid [33;1m27765[0m)

问题是过滤器工厂只能设置一次。设置两次将不起作用,这是我们没有测试过的东西,可能会导致故障(似乎正在发生)

如果您需要应用不止一个gstreamer元素,请创建一个包装器(GstBin),该包装器包含这两个元素,并提供与一个简单过滤器(一个接收器和一个src)相同的pads接口。在GstBin内部,您可以连接任意数量的元件

编辑

您可以有一个GstBin封装各种元素的示例

编辑2

问题出在这一行:

g_object_set (G_OBJECT (audiocheblimit), "mode", "low-pass", NULL);
“mode”
是一个枚举,可以作为字符串传递,但可以作为整数值传递

编辑3

您似乎没有在所需的
.h
文件上声明元素正确性:

 typedef _GstVADCustomFilter {
   GstBin parent;
   ...
 } GstVADCustomFilter;
在您的
.c
文件中:

 G_DEFINE_TYPE (GstVADCustomFilter, gst_v_a_d_custom_filter, GST_TYPE_BIN);

您可能需要为垃圾箱定义一个工厂。或者至少是衬垫,否则过滤器会拒绝它。这是类似的。我还用这些信息编辑了回复。我查看了
faceoverlay
示例,并编辑了我的问题。在
/var/log/kurento media server/media-server\u error.log中可能会有堆栈跟踪。您能给我们最后一个吗?
(kurento media server:20099):GLib GObject警告**:类型为“GstAudioChebLimitMode”的值“((GstAudioChebLimitMode)-1913471257)”对于类型为“GstAudioChebLimitMode”[31;1mSegmentation fault[0m(线程[33;1m140198495102720[0m,pid[33;1m20099[0m]的属性“mode”无效或超出范围
我使用了
audiocheblimit mode=low-pass
我删除了
mode=low-pass
,因为这是默认设置,请检查我的问题以编辑我现在得到的堆栈跟踪
 G_DEFINE_TYPE (GstVADCustomFilter, gst_v_a_d_custom_filter, GST_TYPE_BIN);