我正在尝试获取传入音频样本的dB电平。在每个视频帧上,我更新dB电平并绘制一个表示0-100%值的条(0%是任意值,例如-20.0dB,而100%是0dB。)
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);
这是从here标记为答案的代码示例中改编为C的。我想知道这个非常简单的方程式中缺少什么。
回答:外套对丢失符号的代码是正确的,因此一切最终都是积极的。另外,代码
10 * log(rms)
不正确。当我将幅度转换为分贝(作为输出功率的度量)时,应为20 * log(rms)
。 最佳答案
级别元素最适合此任务(如已经提到的@ensonic),它完全可以满足您的需求。
因此,基本上,您将添加到称为“级别”的管道元素,然后启用消息触发。
然后,级别元素发出包含RMS峰值和衰减值的消息。 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之间的值,您可以根据问题中的说明将其转换为%。
关于audio - gstreamer从缓冲区读取分贝,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32792308/