MLT媒体程序框架03:滤镜——loudness

EBU R.128协议

引用链接
EBU的全称为European Broadcasting Union ,既欧洲广播联盟,为欧洲与北非各广播业者(包含广播电台与电视台)的合作组织,成立于1950年2月12日,有五十多个正式加盟国,总部位于瑞士日内瓦,目前中国是EBU的准会员。
EBU R.128实质上是欧洲广播联盟出的一个关于响度控制的建议书,该建议书在ITU-R BS.1770标准的(国际广播联盟规定的音频节目响度及真峰值的测量算法)基础之上,对响度的被测主体、积分窗长等细节作了更加明确的定义。

响度和动态范围的定义与相关的计量单位

  • 响度(Loudness)的定义: 在声学中,响度是人对声音压力的主观感受,也是听觉的一种属性,根据这种属性,可以对声音进行排序,如从安静排列到响亮,亦或者从响亮排列至安静。响度虽是声音的物理属性,但其却与听者的生理感受,心理感受息息相关,准确来说这属于心理物理学的范畴了。

  • 音量单位dBFS与dB: 首先dBFS与dB都是分贝的意思,而分贝一般指的就是音量大小。 dBFS全称decibels relative to full scale,什么叫full scale呢?既是满刻度,具体来讲是将0作为这种满刻度单位的最大值(也就是说此类值均为负数),凡是带FS后缀的计量单位都可这样理解(如LUFS或LKFS)。dB常用来形容一个音量到目标音量的“距离”,比如需要将一个信号从-4dBFS提升至-1dBFS,那么就需要对-4dBFS做3dB的提升操作。在业界,dBFS常被简称为dB,如-4dB等等。

  • 动态范围: 用通俗不严谨的话来说,动态范围指的是最大音量与最小音量之间的“距离”值,这个“距离”值就被称为动态范围,比如一段音频中的最大音量为-2dBFS,最小音量为-8dBFS,那么它的动态范围就是6dB。站在AD转换器的角度来说,动态范围指的是信号可以达到的最大不失真电平与本底噪声的差值。

  • EBU响度单位LUFS: LUFS的全称为Loudness units relative to full scale,既相对完整刻度的响度单位。广电行业中,LUFS是有一个目标响度值的,那就是-23LUFS,该值是广播世界的终极响度参考值!LUFS的数值越大,其响度就越大。至于为什么是-23LUFS,笔者暂未做深入研究。另外,LKFS是国际广播联盟用的单位,与LUFS差不多。

  • EBU响度单位LU: LU的全称为Loudness units,通常1LU“等同于”1dB(仅仅是理解层面上的“相等”),常用来形容两个LUFS之间的“距离”,如-25LUFS与-18LUFS间差了7LU。综上所述,dBFS与LUFS, dB与LU,虽测量算法不同,但其含义却是相似的。

响度示值,响度范围和真峰值的介绍

  • 瞬时响度 Momentary Loudness: 瞬时响度指的是400MS(毫秒)内的响度,并每过100ms进行一次更新,响应相当灵敏。
  • 短期响度 Short Term Loudness: 短期响度是提取3秒以内的信号,表达的是3S内的平均响度。
  • 综合响度 Integrated Loudness: 综合响度指的是整段音频的平均响度。
  • 响度范围 Loudness Range: 响度范围,经常被简称为LRA,其代表的是两个LUFS之间的“距离”,如一段音频的最小响度为-25LUFS,最大响度为-18LUFS,其间差了7LU,既代表该音频的响度范围为7LU。响度范围与动态范围表达的是一个意思,只是测量方法不一样。
  • 真峰值 True Peak: 在说真峰值之前,先用通俗的话来说说峰值是什么,峰值就是波形振幅的波峰值(波形有波谷和波峰之分),说白了就是波形瞬态的最大电平值。那为什么要在峰值之前加个“真”字呢?原因是这样的,以前有一种峰值测量方法,只有当峰值的持续时间超过一定的时间时(通常是几毫秒),才会计算出比较准确的峰值,这种测量算法被称为准峰值(QPPM)。而EBU给出了一种新的算法,无论它的持续时间有多短,都能正确的测量出其波形的真实峰值水平,故此,称其为真峰值。那么响度表中的真峰值指示条是用来干嘛的呢?它是用来检测信号有没有过载的,一旦信号过载就会被削波造成信号失真,正因如此,EBU给出建议为真峰值不要超过-1dBTP,目的就是防止信号产生过载削波,其单位为dBTP(dB True Peak真实峰值),对应的值是dBFS值。

双遍滤镜(loudness)

主要用于音频向度的精准标准化,其核心作用是通过两次处理(Double Pass)分析音频特征并应用目标响度参数,确保输出音频符合行业标准(如EBU R128 或 ITU-R BS.1770),同时优化动态范围控制

使用方式

One Pass: 调用滤镜分析得到result

std::string AudioAnalyze::analyzeAudio(const std::string &path,int trimIn,int trimOut) {
   
   
    Producer producer(getGlobalProfile(), nullptr,path.c_str());
    if(producer.get_length() <= 1 || producer.get_int("audio_index") == -1){
   
   
        std::cout << "analyzeAudio no effect"  << std::endl;
        return "";
    }
    if(trimOut > 0){
   
   
        producer.set_in_and_out(trimIn,trimOut);
    }
    Filter filter(getGlobalProfile(),"loudness");
    filter.set("program",-29);
    producer.attach(filter);

    Consumer consumer(getGlobalProfile(), "null");
    consumer.set("terminate_on_pause",0);
    consumer.connect(producer);
    consumer.start();
    while (!consumer.is_stopped()) {
   
   
       // ignore
        if(filter.property_exists("results")){
   
   
            const char *results = filter.get("results");
            if(results != nullptr) {
   
   
                std::cout << "analyzeAudio results:" << results << std::endl;
                consumer.stop();
                return results;
            } else {
   
   
                std::cout << "analyzeAudio results:" << "error: key is null" << std::endl;
                return "";
            }
        }
    }
    return "";
}

Two Pass: 把result写入滤镜参数中,则会自动调整目标响度

std::shared_ptr<Filter> loudnessFilter{
   
   nullptr};
if (!results.empty()) {
   
   
    loudnessFilter = std::make_shared<Filter>(getGlobalProfile(), "loudness");
    loudnessFilter->set("program", configuration.aiDefaultLoudness);
    loudnessFilter->set("disable", 0);
    loudnessFilter->set("reload", 1);
    auto length = results.length() + 1;
    char *result = (char *) malloc(results.length() + 1);
    memcpy((void *) result, (const void *) results.c_str(), results.length());
    result[length - 1] = '\0';
    loudnessFilter->set("results", result);
}
loudnessFilter->set_in_and_out(trimIn, trimOut);
childClipInfo<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值