Skip to content

增加了响度均衡的功能#878

Open
423A35C7 wants to merge 6 commits intozhongyang219:masterfrom
423A35C7:master
Open

增加了响度均衡的功能#878
423A35C7 wants to merge 6 commits intozhongyang219:masterfrom
423A35C7:master

Conversation

@423A35C7
Copy link
Copy Markdown

由于每个音乐的响度不同,所以想看看有没有响度均衡的功能,看到#488 已经有人提到了,但是没有实现,于是自己实现了一下响度均衡的功能。

现在在选项中开启后,会自动读取音频中的REPLAYGAIN_TRACK_GAIN标签并调整响度,此标签是通过 rsgain 预先计算后以标签的形式保存到音频文件中的,是提前用rsgain的命令行工具计算好的。以后也许可以把rsgain集成到应用中,就像修改标签、下载歌词和封面的功能那样。(或者作者也可以看看有没有别的获取REPLAYGAIN_TRACK_GAIN的方法)

其他

rsgain的目标标准化响度是-18 LUFS,表达的是再增加gain dB的响度就到达-18 LUFS了,但是由于平时下载的音乐的响度计算平均后为-10 LUFS(根据自己的经验得出,可能有待调整),这里要计算的是再增加多少dB的响度就到达-10 LUFS。以及BASS_FX的调整是线性音量,需要把dB转换到线性系数。

顺便夸夸作者的软件真的非常好用!希望作者能在README文档里写下贡献指南之类的,新人第一次参与开源还是有点迷茫的。

@pdy265
Copy link
Copy Markdown

pdy265 commented Sep 19, 2025

这个功能好啊 以前千千静听上是有的,希望原作者能合并到主线里。或者我该如何下载使用你的分支呢?

@zhongyang219
Copy link
Copy Markdown
Owner

刚刚尝试跑了一下代码,发现CTagLibHelper::GetReplayGain函数似乎无法正确获取到REPLAYGAIN_TRACK_GAIN的值,建议使用CAudioTag::GetAudioTagPropertyMap函数获取,同时将GetReplayGain的逻辑移到CAudioTag类中。

@423A35C7
Copy link
Copy Markdown
Author

423A35C7 commented Oct 6, 2025

时间有点长了差点忘记了,回顾了一下,CAudioTag::GetAudioTagPropertyMap直接调用了taglib,我查看了taglib的官网,似乎并未提到任何有关响度均衡或replay gain的内容,实际使用时也确实无法直接使用taglib获取到REPLAYGAIN_TRACK_GAIN标签,所以只能另外获取标签,浏览后发现放在CTagLibHelper::OtherPropertyToSongInfo也许是更好的选择,所以CTagLibHelper::GetReplayGain的一部分逻辑移到了CTagLibHelper::OtherPropertyToSongInfo,另一部分逻辑是只针对MP4文件的,移到了CTagLibHelper::getM4aPropertyMap。

(之前单独用CTagLibHelper::GetReplayGain是因为播放用的IPlayerCore::Open(const wchar_t* file_path)函数只能接收文件名,和标签无关,但是响度均衡需要在播放时用到标签,所以为了在IPlayerCore::Open函数里获取到标签的值就这样写的。)

这个逻辑感觉挺复杂的,它不像一般的标签和播放无关,它是和播放有关的。倒是有点像均衡器,但是参数又要从标签中获取。

关于无法正确获取到REPLAYGAIN_TRACK_GAIN的值,我目前只测试了mp3、flac、mp4文件,均能正确获取,其他文件类型没有测试。

所以就看这个REPLAYGAIN_TRACK_GAIN标签怎么处理了,如果要和其他标签一样,那就是按照这个新提交的,并且需要修改CSongDataManager::SaveSongData和CSongDataManager::LoadSongData;如果是单独获取,那就是按照原来的。

细节

关于标签的逻辑把replay_gain属性放到了SongInfo里,同时对应修改了SongInfo::CopyAudioTag,增加新的文件时可以正常获取标签,但是不敢修改CSongDataManager::SaveSongData和CSongDataManager::LoadSongData,这个改了可能影响很大,而且和版本号有关不敢乱改。所以现在增加新的文件时可以正常获取标签,如果已经播放过的文件需要用“重新载入播放列表”才能获取REPLAYGAIN_TRACK_GAIN标签。

关于播放的逻辑把ApplyReplayGain移到了CPlayer::MusicControl函数里的case Command::OPEN中,增加了IPlayerCore::ApplyReplayGain,CFfmpegCore和CMciCore里的ApplyReplayGain没有实现就先空着了。

现在会自动读取音频中的REPLAYGAIN_TRACK_GAIN标签(使用rsgain提取)并调整响度。
rsgain的目标标准化响度是-18 LUFS,表达的是再增加gain dB的响度就到达-18 LUFS了,但是由于平时下载的音乐的响度计算平均后为-10 LUFS,这里要计算的是再增加多少dB的响度就到达-10 LUFS。
关于标签的逻辑:CTagLibHelper::GetReplayGain的一部分逻辑移到了CTagLibHelper::OtherPropertyToSongInfo,另一部分逻辑是只针对MP4文件的,移到了CTagLibHelper::getM4aPropertyMap。
把replay_gain属性放到了SongInfo里,同时对应修改了SongInfo::CopyAudioTag,但是没有修改CSongDataManager::SaveSongData和CSongDataManager::LoadSongData,所以现在增加新的文件时可以正常获取标签,如果已经播放过的文件需要用“重新载入播放列表”才能获取REPLAYGAIN_TRACK_GAIN标签。

应用响度均衡的逻辑:现在将ApplyReplayGain移到了CPlayer::MusicControl函数里的case Command::OPEN中,增加了IPlayerCore::ApplyReplayGain虚函数,CFfmpegCore和CMciCore里的ApplyReplayGain暂时还没有实现就先空着了。
BassCore.cpp里一些多余的改动去掉;
BassFxLibrary.h里要手动添加原先bass_fx.h的部分内容;
更改选项界面,增加响度均衡的复选框。
在修复之前,需要手动使用“重新载入播放列表”。
这个数据版本不确定是不是应该自增一,就先这样了。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants