Gstreamer从缓冲器读取分贝



我正试图获得传入音频样本的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代码样本,标记为答案,从这里。我想知道我在这个非常简单的方程中遗漏了什么。

answer : jacket关于代码丢失符号的判断是正确的,所以所有结果都是正的。代码10 * log(rms)也不正确。它应该是20 * log(rms),因为我正在将振幅转换为分贝(作为输出功率的度量)。

level元素最适合这个任务(正如@ enonic已经提到的),它的目的正是你需要的。

所以基本上你添加到你的管道元素名为"level",然后启用消息触发。

Level元素然后发出包含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之间的值,您可以使用它转换为%,如您在问题中所述。

最新更新