2015-09-26 9 views
1

Я пытаюсь получить уровень входных аудиоданных уровня дБ. На каждом видеокадра, я обновить уровень дБ и рисуем бар, представляющий 0 - значение 100% (0% нечто произвольное такое как -20.0dB а 100% 0 дБ.)gstreamer читать децибел из буфера

gdouble sum, rms; 
sum = 0.0; 
guint16 *data_16 = (guint16 *)amap.data; 
for (gint i = 0; i < amap.size; i = i + 2) 
{ 
    gdouble sample = ((guint16)data_16[i])/32768.0; 
    sum += (sample * sample); 
} 
rms = sqrt(sum/(amap.size/2)); 
dB = 10 * log10(rms); 

Это была адаптирована к C из образца кода, помеченного как ответ, от here. Мне интересно, что мне не хватает из этого простого уравнения.

ответил (а): Куртка была верна в отношении кода, теряющего знак, поэтому все положилось. Также неверен код 10 * log(rms). Он должен быть 20 * log(rms), так как я преобразую амплитуду в децибелы (в качестве меры выходной мощности).

+0

Поскольку я идиот, я забыл описать, в чем проблема. Значение дБ, возвращаемое из этого уравнения, всегда находится где угодно от +1 до +5, даже для очень тихого звука. –

+0

Код выглядит правильно, поэтому проблема в чем-то тонкая. Поскольку dB положителен, значит, rms выходит больше 1. Возможно, сумма слишком велика, что приведет к конверсии в 'gdouble' – jaket

+0

Не можете ли вы использовать элемент уровня или, по крайней мере, математику? – ensonic

ответ

2

Элемент уровня лучше всего подходит для этой задачи (как @ensonic уже упоминалось) его планируемым именно то, что вам нужно ..

Так в основном вы добавляете в свой элемент трубы под названием «уровень», а затем включить сообщения запуска ,

Элемент уровня затем испускает сообщения, содержащие значения RMS Peak and Decay. RMS - это то, что вам нужно.

Вы можете настроить функцию обратного вызова подключаются к такому событию сообщения:

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); 

переменной шина имеет типа GstBus .. Я надеюсь, вы знаете, как работать с buses

Затем в обратном вызове проверке функции для имя элемента и получить RMS, как описано here

Существует также алгоритм нормализации с функцией pow() для преобразования в значение между 0.0 -> 1.0, которое вы можете использовать для преобразования в%, поскольку вы указанный в вашем вопросе.

+0

Спасибо за последний бит. У меня есть хороший маленький бар, который выдается, что дает приблизительное представление о том, что такое уровень дБ. –