Top |
guint | bands | Read / Write |
guint64 | interval | Read / Write |
gint | threshold | Read / Write |
gboolean | message-magnitude | Read / Write |
gboolean | message-phase | Read / Write |
gboolean | post-messages | Read / Write |
gboolean | multi-channel | Read / Write |
GObject ╰── GInitiallyUnowned ╰── GstObject ╰── GstElement ╰── GstBaseTransform ╰── GstAudioFilter ╰── GstSpectrum
The Spectrum element analyzes the frequency spectrum of an audio signal. If the “post-messages” property is TRUE, it sends analysis results as element messages named
"spectrum"
after each interval of time given
by the “interval” property.
The message's structure contains some combination of these fields:
GstClockTime
"timestamp"
:
the timestamp of the buffer that triggered the message.
GstClockTime
"stream-time"
:
the stream time of the buffer.
GstClockTime
"running-time"
:
the running_time of the buffer.
GstClockTime
"duration"
:
the duration of the buffer.
GstClockTime
"endtime"
:
the end time of the buffer that triggered the message as stream time (this
is deprecated, as it can be calculated from stream-time + duration)
GstValueList of gfloat
"magnitude"
:
the level for each frequency band in dB. All values below the value of the
“threshold” property will be set to the threshold. Only present
if the “message-magnitude” property is TRUE
.
GstValueList of gfloat
"phase"
:
The phase for each frequency band. The value is between -pi and pi. Only
present if the “message-phase” property is TRUE
.
If “multi-channel” property is set to true. magnitude and phase fields will be each a nested GstValueArray. The first dimension are the channels and the second dimension are the values.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
/* GStreamer * Copyright (C) 2006 Stefan Kost <ensonic@users.sf.net> * Copyright (C) 2008 Jan Schmidt <jan.schmidt@sun.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <gst/gst.h> static guint spect_bands = 20; #define AUDIOFREQ 32000 /* receive spectral data from element message */ 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; } int main (int argc, char *argv[]) { GstElement *bin; GstElement *src, *audioconvert, *spectrum, *sink; GstBus *bus; GstCaps *caps; GMainLoop *loop; gst_init (&argc, &argv); bin = gst_pipeline_new ("bin"); src = gst_element_factory_make ("audiotestsrc", "src"); g_object_set (G_OBJECT (src), "wave", 0, "freq", 6000.0, NULL); audioconvert = gst_element_factory_make ("audioconvert", NULL); g_assert (audioconvert); spectrum = gst_element_factory_make ("spectrum", "spectrum"); g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80, "post-messages", TRUE, "message-phase", TRUE, NULL); sink = gst_element_factory_make ("fakesink", "sink"); g_object_set (G_OBJECT (sink), "sync", TRUE, NULL); gst_bin_add_many (GST_BIN (bin), src, audioconvert, spectrum, sink, NULL); caps = gst_caps_new_simple ("audio/x-raw", "rate", G_TYPE_INT, AUDIOFREQ, NULL); if (!gst_element_link (src, audioconvert) || !gst_element_link_filtered (audioconvert, spectrum, caps) || !gst_element_link (spectrum, sink)) { fprintf (stderr, "can't link elements\n"); exit (1); } gst_caps_unref (caps); bus = gst_element_get_bus (bin); gst_bus_add_watch (bus, message_handler, NULL); gst_object_unref (bus); gst_element_set_state (bin, GST_STATE_PLAYING); /* we need to run a GLib main loop to get the messages */ loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); gst_element_set_state (bin, GST_STATE_NULL); gst_object_unref (bin); return 0; } |
plugin |
spectrum |
author |
Erik Walthinsen <omega@cse.ogi.edu>, Stefan Kost <ensonic@users.sf.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> |
class |
Filter/Analyzer/Audio |
name |
sink |
direction |
sink |
presence |
always |
details |
audio/x-raw, format=(string){ S16LE, S24LE, S32LE, F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string)interleaved |
name |
src |
direction |
source |
presence |
always |
details |
audio/x-raw, format=(string){ S16LE, S24LE, S32LE, F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string)interleaved |
“bands”
property “bands” guint
Number of frequency bands.
Flags: Read / Write
Allowed values: [2,1073741824]
Default value: 128
“interval”
property “interval” guint64
Interval of time between message posts (in nanoseconds).
Flags: Read / Write
Allowed values: >= 1
Default value: 100000000
“threshold”
property “threshold” gint
dB threshold for result. All lower values will be set to this.
Flags: Read / Write
Allowed values: <= 0
Default value: -60
“message-magnitude”
property “message-magnitude” gboolean
Whether to add a 'magnitude' field to the structure of any 'spectrum' element messages posted on the bus.
Flags: Read / Write
Default value: TRUE
“message-phase”
property “message-phase” gboolean
Whether to add a 'phase' field to the structure of any 'spectrum' element messages posted on the bus.
Flags: Read / Write
Default value: FALSE
“post-messages”
property “post-messages” gboolean
Whether to post a 'spectrum' element message on the bus for each passed interval.
Flags: Read / Write
Default value: TRUE