i trying db level of incoming audio samples. on every video frame, update db level , draw bar representing 0 - 100% value (0% being arbitrary such -20.0db , 100% being 0db.)
gdouble sum, rms; sum = 0.0; guint16 *data_16 = (guint16 *)amap.data; (gint = 0; < amap.size; = + 2) { gdouble sample = ((guint16)data_16[i]) / 32768.0; sum += (sample * sample); } rms = sqrt(sum / (amap.size / 2)); db = 10 * log10(rms);
this adapted c code sample, marked answer, here. wondering missing simple equation.
answered: jacket correct code loosing sign, ended being positive. code 10 * log(rms)
incorrect. should 20 * log(rms)
converting amplitude decibels (as measure of outputted power).
the level element best task (as @ensonic mentioned) intended need..
so add pipe element called "level", enable messages triggering.
level element emits messages contains values of rms peak , decay. rms need.
you can setup callback function connected such message event:
audio_level = gst_element_factory_make ("level", "audiolevel"); g_object_set(audio_level, "message", true, null); ... g_signal_connect (bus, "message::element", g_callback (callback_function), this);
bus variable of type gstbus.. hope know how work buses
then in callback function check element name , rms described here
there normalization algorithm pow() function convert value between 0.0 -> 1.0 can use convert % stated in question.
Comments
Post a Comment