audio - gstreamer 从缓冲区读取分贝

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

这是从代码示例改编为 C 的,标记为答案,来自 here 。我想知道这个非常简单的方程中我遗漏了什么。

已回答:jacket对于丢失符号的代码是正确的,所以一切最终都是积极的。此外,代码 10 * log(rms) 也不正确。它应该是20 * log(rms),因为我将幅度转换为分贝(作为输出功率的度量)。

最佳答案

关卡元素最适合此任务(正如 @ensonic 已经提到的),它的目的正是满足您的需求。

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

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

bus 变量的类型为 GstBus.. 我希望您知道如何使用 buses

然后在回调函数中检查元素名称并获取 RMS,如所述 here

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

关于audio - gstreamer 从缓冲区读取分贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32792308/

相关文章:

android - 如何在通话期间通过代码启用 Android 扬声器?

mysql - Docker - 多个重复卷声明;怎么了?

c++ - 将 VST 音效/插件应用于音频文件

audio - Openvidu-将视频通话音频设置为扬声器Android

c# - Gstreamer 单声道开发人员

c++ - Gstreamer audiofirfilter

ffmpeg - Gstreamer rtp 视频混合器,找到了一个工作流水线,但需要改进

javascript 体积计算器,根据宽度、长度和深度

Javascript 从音轨中选择片段

android - 如何将 raw 文件夹中的 mp3/mp4 播放到 android 中的默认播放器?