gstreamer从缓冲区

时间:2015-09-26 00:12:28

标签: audio gstreamer volume decibel

我正在尝试获取传入音频样本的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),因为我将振幅转换为分贝(作为输出功率的度量)。

1 个答案:

答案 0 :(得分:2)

关卡元素最适合这项任务(正如@ensonic已经提到的那样),它的目的正是你需要的......

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

然后,Level元素会发出包含RMS Peak和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转换为%,如您在问题中所述。