1

我正在尝试获取传入音频样本的 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);

这已从标记为答案的代码示例中改编为 C,来自此处。我想知道这个非常简单的方程式中缺少什么。

回答:夹克关于丢失标志的代码是正确的,所以一切最终都是积极的。代码10 * log(rms)也不正确。应该是20 * log(rms)因为我将幅度转换为分贝(作为输出功率的度量)。

4

1 回答 1

2

关卡元素最适合这项任务(正如@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 类型。我希望你知道如何使用总线

然后在回调函数中检查元素名称并获取此处描述的 RMS

还有一个带有 pow() 函数的归一化算法可以转换为 0.0 -> 1.0 之间的值,您可以使用它来转换为 % ,如您在问题中所述。

于 2015-09-28T14:02:25.040 回答