)
简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮文章目录1.前言2.应用场景和用法2.1在音量表示之间转换2.2函数原型与返回语义3.调用流程剖析3.1按来源格式和目标格式执行换算3.2与GstStreamVolume属性读写衔接4.实战案例4.1准备不同格式的音量值4.2执行换算并检查结果4.3完整代码5.总结1.前言本篇目的理解gst_stream_volume_convert_volume()如何在线性音量、立方音量和分贝表示之间换算并分析它与GstStreamVolume音量属性的关系。音量值可以用不同形式表示。GstStreamVolume接口的volume属性使用线性倍率应用界面则可能使用立方曲线控制滑块音频工具也常用dB显示音量。gst_stream_volume_convert_volume()负责在这三种表示之间换算数值。它只计算并返回新值不修改音频流、不设置对象属性也不改变静音状态。界面音量值gst_stream_volume_convert_volume线性倍率或分贝值GstStreamVolume的volume属性音频元素读取线性音量2.应用场景和用法2.1在音量表示之间转换接口适合在不同模块使用不同音量单位时转换数值场景输入表示转换结果用途更新音量滑块线性倍率立方音量让滑块位置更适合人耳感知显示音量读数线性倍率dB在调音界面显示分贝将滑块值写入元素立方音量线性倍率设置volume属性恢复配置音量dB线性倍率将分贝配置转换为属性使用的倍率2.2函数原型与返回语义函数原型如下gdoublegst_stream_volume_convert_volume(GstStreamVolumeFormat from,GstStreamVolumeFormat to,gdouble val);参数含义from输入数值的表示方式to目标表示方式val按from格式解释的音量值支持的格式及换算关系如下格式含义主要换算关系GST_STREAM_VOLUME_FORMAT_LINEAR线性倍率1.0表示100%线性转dB20 × log10(线性值)GST_STREAM_VOLUME_FORMAT_CUBIC立方音量线性转立方线性值的立方根GST_STREAM_VOLUME_FORMAT_DB振幅分贝不是功率分贝dB转线性10的dB / 20次方例如线性值0.25转换为dB约为-12.04。线性值转换为dB时0.0会得到负无穷大因为log10(0)没有有限值。此接口不把输入限制在0.0到1.0之间因此大于1.0的线性倍率也可以转换。线性和立方格式的输入必须大于或等于零负值会触发参数检查并返回0.0。gst_stream_volume_get_volume()和gst_stream_volume_set_volume()也使用该转换函数读取时把属性中的线性倍率转换成所需格式设置时先把输入值转换为线性倍率再写入对象的volume属性。静音由独立的mute属性控制不由音量换算函数处理。3.调用流程剖析3.1按来源格式和目标格式执行换算实现根据from格式进入对应分支再根据to格式计算结果。三种格式之间的公式分别是线性 → 立方pow(val, 1 / 3.0) 立方 → 线性val × val × val 线性 → dB20.0 × log10(val) 立方 → dB60.0 × log10(val) dB → 线性pow(10.0, val / 20.0) dB → 立方pow(10.0, val / 60.0)当输入和目标格式相同时函数直接返回原值。非法格式组合无法匹配任何分支最终会触发运行时检查并返回0.0。线性立方分贝读取from和to格式判断输入格式检查输入非负并计算检查输入非负并计算按分贝公式计算目标格式返回转换后的数值立方音量与线性音量的关系是立方变换而不是分贝换算。立方曲线常用于音量滑块使滑块数值变化更贴近听感。dB表示则采用振幅关系因此公式使用20 × log10而不是功率计算常见的10 × log10。3.2与GstStreamVolume属性读写衔接gst_stream_volume_convert_volume()是独立的数值换算函数不需要GstStreamVolume对象。对象接口的读写函数则负责把换算结果连接到volume属性gst_stream_volume_get_volume()先读取线性属性再转换成调用者要求的格式。gst_stream_volume_set_volume()先把调用者的输入转换成线性值再写入属性。gst_stream_volume_get_mute()和gst_stream_volume_set_mute()分别读取和设置静音状态不参与音量格式转换。调用者提供音量值set_volume接口转换成线性倍率写入volume属性元素读取线性倍率读取volume属性get_volume接口转换成调用者要求的格式应用直接使用g_object_set()设置volume时应传入线性倍率。若界面使用dB或立方值应先通过接口转换避免把一种格式的数值误当成另一种格式。4.实战案例4.1准备不同格式的音量值本案例用线性倍率0.25模拟应用内部保存的音量值。程序分别把它转换为立方值和dB再将dB转换回线性倍率。这能验证两点转换函数接受格式枚举和数值不需要音量对象往返转换后线性值应与初始值接近。4.2执行换算并检查结果程序依次执行线性倍率转换为立方值。线性倍率转换为dB。dB转换回线性倍率。检查往返计算产生的浮点误差是否在允许范围内。浮点运算存在精度误差因此使用小误差范围比较不直接判断两个gdouble值完全相等。4.3完整代码#includegst/gst.h#includegst/audio/audio.h#includemath.hintmain(intargc,char*argv[]){gdouble linear_volume0.25;gdouble cubic_volume;gdouble db_volume;gdouble restored_volume;gst_init(argc,argv);/* 将线性倍率转换为适合滑块展示的立方音量 */cubic_volumegst_stream_volume_convert_volume(GST_STREAM_VOLUME_FORMAT_LINEAR,GST_STREAM_VOLUME_FORMAT_CUBIC,linear_volume);/* 将线性倍率转换为振幅分贝 */db_volumegst_stream_volume_convert_volume(GST_STREAM_VOLUME_FORMAT_LINEAR,GST_STREAM_VOLUME_FORMAT_DB,linear_volume);/* 将分贝值转回线性倍率检查往返转换 */restored_volumegst_stream_volume_convert_volume(GST_STREAM_VOLUME_FORMAT_DB,GST_STREAM_VOLUME_FORMAT_LINEAR,db_volume);/* 允许浮点运算产生少量误差 */if(fabs(restored_volume-linear_volume)1e-12){g_printerr(Volume conversion round trip failed\n);return1;}/* 0.25的立方音量应约为0.62996分贝值约为-12.04 */if(cubic_volume0.0||db_volume0.0){g_printerr(Converted volume is outside the expected range\n);return1;}return0;}5.总结gst_stream_volume_convert_volume()就是在GStreamer线性音量、立方音量和振幅分贝表示之间执行数值换算不修改音频流或对象属性。