#响度 #测量 #flac #bs #tags #itu-r

bs1770

符合ITU-R BS.1770-4的响度分析

1个稳定版本

1.0.0 2020年9月2日

#527音频

Download history 291/week @ 2024-03-09 275/week @ 2024-03-16 300/week @ 2024-03-23 222/week @ 2024-03-30 127/week @ 2024-04-06 220/week @ 2024-04-13 170/week @ 2024-04-20 116/week @ 2024-04-27 161/week @ 2024-05-04 74/week @ 2024-05-11 98/week @ 2024-05-18 59/week @ 2024-05-25 67/week @ 2024-06-01 74/week @ 2024-06-08 17/week @ 2024-06-15 6/week @ 2024-06-22

173 每月下载量
用于 zoog

Apache-2.0

35KB
392 代码行

BS1770

Rust库,实现了ITU-R BS.1770-4响度测量的功能。

还包括一个将响度写入flac标签的二进制文件。

示例

let sample_rate_hz = 44_100;
let bits_per_sample = 16;
let channel_samples: [Vec<i16>; 2] = load_stereo_audio();

// When converting integer samples to float, note that the maximum amplitude
// is `1 << (bits_per_sample - 1)`, one bit is the sign bit.
let normalizer = 1.0 / (1_u64 << (bits_per_sample - 1)) as f32;

let channel_power: Vec<_> = channel_samples.iter().map(|samples| {
    let mut meter = bs1770::ChannelLoudnessMeter::new(sample_rate_hz);
    meter.push(samples.iter().map(|&s| s as f32 * normalizer));
    meter.into_100ms_windows()
}).collect();

let stereo_power = bs1770::reduce_stereo(
    channel_power[0].as_ref(),
    channel_power[1].as_ref(),
);

let gated_power = bs1770::gated_mean(stereo_power.as_ref());
println!("Integrated loudness: {:.1} LUFS", gated_power.loudness_lkfs());

为flac文件打标签

examples目录中包含了一个名为flacgain的二进制文件,用以下命令构建它:

RUSTFLAGS="-C target-cpu=native" cargo build --release --example flacgain

然后运行

target/release/examples/flacgain FILE...

程序接受文件名或更多的flac文件作为参数,并计算它们的响度,以及文件集合(假设为专辑)的响度。

默认情况下,程序只将响度打印到stdout,添加--write-tags标志也可以将响度存储在元数据标签中。这将添加以下标签:

  • BS17704_TRACK_LOUDNESS
  • BS17704_ALBUM_LOUDNESS

如果存在任何REPLAYGAIN_*标签,程序将删除这些标签。使用这些标签而不是ReplayGain的理由是,ReplayGain已经变得模糊不清:它存储了一个增益(目标响度与测量响度之间的差异),但不同的标签器使用不同的参考级别,这意味着只有当你小心地确保你收藏中的所有文件都使用相同的目标设置时,ReplayGain才能标准化响度。通过存储响度而不是增益,避免了这个问题。通过将标签命名为特定的响度定义(BS.1770-4),BS.1770的未来的修订版不会使这些标签变得模糊。

程序写入一个新文件并将其覆盖旧文件,因此当前权限位会丢失。程序只替换VORBIS_COMMENT块,并保留文件的其他部分不变。它使用copy_file_range来启用支持此功能的文件系统上的重链接。

如果你有一组flac文件,其中每个叶目录都包含一个专辑,你可以使用包含的脚本tag_collection.sh在收藏中的每个专辑上运行flacgain --write-tags

性能

最初的重点是正确性,库尚未进行优化。有很多优化潜力,例如通过组合过滤器、展开循环、应用矢量化等。

参考资料

  • ITU-R BS.1770-4,这是一项规定如何测量音量的标准,并定义了LKFS单位(全量程音量单位,K加权)。
  • ITU-R BS.1771-1 在BS.1770的基础上增加了一些构建音量计的要求。
  • EBU R 128,它基于BS.1770音量测量规定了一个目标音量级别。
  • EBU Tech 3341 规定了“EBU模式”音量计,但特别提供了测试向量来确认音量计正确实现了BS.1770。它还建议放弃在BS.1770中引入的“LKFS”术语,而采用“LUFS”术语。K加权将在其他地方表示。
  • EBU Tech 3342,它规定了如何测量音量范围。

致谢

  • 滤波系数公式改编自Christian Steinmetz的pyloudnorm
  • 滤波系数公式最初归功于Brecht De Man,但相关的论文无法公开获取。

许可证

BS1770采用Apache 2.0许可证。它可以在免费软件和闭源应用程序中使用,包括商业和非商业用途,前提是符合许可证中规定的条件。如果您想在GPLv2许可证的软件中使用BS1770,您可以在版权声明中添加一个例外。如果不同意许可证的选择,请不要提交问题。

无运行时依赖