是否可以使用 GStreamer 管道构建简单的音高标签系统?

Is it possible to build simple pitch labeling system using GStreamer pipeline?

我对 GStreamer 的使用经验不多,但我认为它是一个非常强大的工具。我想知道是否可以使用 GStreamer 管道构建简单的音高标签系统。该系统应在单个时间点播放一个音符的音频输入,并打印有关该音符的信息:频率(例如 440 Hz)或名称(例如 A4)。

我想 Spectrum element 可能可以使用,但不幸的是我不知道如何用这个元素构建最简单的管道:

gst-launch-1.0 pulsesrc ! # What should I put here?

你能至少提供一个最简单的使用 Spectrum 元素的工作管道吗?如果能作为进一步研究的起点,我将不胜感激。

我想你会做这样的事情:

我没有流光设置,所以我无法测试它,但我建议尝试一下:

gst-launch-1.0 pulsesrc ! audioconvert ! spectrum ! debugspy ! fakesink

但 debugspy 只是用于调试发送到总线的消息!

https://gstreamer.freedesktop.org/documentation/spectrum/index.html?gi-language=c#spectrum

但老实说,如果您在该页面上看到示例代码,则会输出一系列消息,其中包含有关幅度和相位的信息。我不知道你将如何使用这些信息来计算频率或名称,但想象一下,这样做你最好编写一个程序而不是使用命令行 (gst-launch-1.0 )

static gboolean
message_handler (GstBus * bus, GstMessage * message, gpointer data)
{
  if (message->type == GST_MESSAGE_ELEMENT) {
    const GstStructure *s = gst_message_get_structure (message);
    const gchar *name = gst_structure_get_name (s);
    GstClockTime endtime;

    if (strcmp (name, "spectrum") == 0) {
      const GValue *magnitudes;
      const GValue *phases;
      const GValue *mag, *phase;
      gdouble freq;
      guint i;

      if (!gst_structure_get_clock_time (s, "endtime", &endtime))
        endtime = GST_CLOCK_TIME_NONE;

      g_print ("New spectrum message, endtime %" GST_TIME_FORMAT "\n",
          GST_TIME_ARGS (endtime));

      magnitudes = gst_structure_get_value (s, "magnitude");
      phases = gst_structure_get_value (s, "phase");

      for (i = 0; i < spect_bands; ++i) {
        freq = (gdouble) ((AUDIOFREQ / 2) * i + AUDIOFREQ / 4) / spect_bands;
        mag = gst_value_list_get_value (magnitudes, i);
        phase = gst_value_list_get_value (phases, i);

        if (mag != NULL && phase != NULL) {
          g_print ("band %d (freq %g): magnitude %f dB phase %f\n", i, freq,
              g_value_get_float (mag), g_value_get_float (phase));
        }
      }
      g_print ("\n");
    }
  }
  return TRUE;
}

他们已经实现了消息处理程序。您可以修改此代码以执行任何您想要的幅度/相位计算。或者输出到其他程序。

如果您知道要使用哪些插件,那么使用 gst-launch 是有意义的,但我不清楚哪个插件可用于从频谱计算频率/名称(我对音频了解不多/ 英尺)。它似乎是为数不多的具有代码示例的插件之一,而不是如何使用 gst-launch 的示例,所以我再次猜测他们可能打算让您编写自己的消息处理程序而不是而不是使用插件进行输出。