最近写的有损无损混合编解码器,以及为foobar2000写的插件总结
foobar2000吧
全部回复
仅看楼主
level 2
一念執著6 楼主
起因是我下载了27000+首华语无损单曲700G(质量参差不齐,大部分质量可以),然後整理了一遍,存到硬盘里面,就空间不多了。而且我还想同时存下有损格式的。试了几个aac编码器,最後选定qaac,转码後200G,这样一来,我磁盘空间就剩3M了。于是,我希望减少空间占用,开始考虑混合编码方式,也就是有损和无损结合的编码方式,这样可以减少总的文件体积。
无损700G我是无法放到电脑硬盘里的,它存在移动硬盘了,而有损200G放在电脑硬盘里且移动硬盘有备份。所以对有损和无损我都有需求,而且手机上也需使用(我手机空间经常爆满),为了节约空间当然该用有损音乐了。
我在网上寻找混合编码方式,只找到了wavpack混合模式、ofs双流模式、MP3HD、MPEG-4 SLS,後两者效果实在不满足音质和体积综合要求,前两者支持设备极少,只有电脑能够以插件支持。最好是aac编码器加无损混合编码,因为aac格式足够优秀,且支持广泛。于是开始手头写这样的工具。
为了能够播放混合无损格式(电脑上用插件支持),开始写foobar2000的插件foo_input_hybrid,期间查阅了不少foobar2000sdk的英文文档,奈何只有SDK没有任何帮助文档(sdk里面有个foo_sample而已)。不得不吐槽该软件作者的设计意义,sdk实在难看懂,不通读都不知道何意义,关键是运行流程和结构如何也不知道,只能一遍一遍试出来,为此趟了很多坑。
而且,aac解码器也存在解码结果的不确定性,为此,我试过了多种有损解码器(ogg,mp3,opus等),发现它们都是不确定的。而此时我正好关注了开源解码器faad,它的解码结果竟然是确定的,于是尝试用它写foo_input_sfaad插件和sfaad cli程序。同时,我也在写audio_hybrid cli程序,这是一个命令行处理混合编解码的程序,它支持外包编解码、混合编码、混合解码、生成纠错文件。
audio_hybrid是其中最基本的,我为之写了g++和msvc++的版本,g++的用CMake编译,可以确保基本的跨平台(无需大改),msvc++的用Intel C++编译以求支持AVX指令集和64位嵌入汇编(一开始没用高级指令集,後来发现运行速度不是很好)。这个程序是其中最复杂的,它可以条件编译出使用各类高级指令集的程序或自主选择,它处理了宽字符串(需要注意它是windows cli专用)以适应不同字符编码,为此写了VA_OPT.h头文件(计算宏参数个数和宽字符拼接)。
在测试环节,也发现了各种问题,然後改正。但是,faad源码前端计算数据大小竟然用float类型(应为整型),faad源码前端并不能正确处理音频时间相位偏移和时长,它正确处理了faac编码器得到的aac文件。所以,编写的foobar2000插件只能适配faac编码,不能用qaac或fhgaac编码,这在256k
bp
s码率之下有劣势。前後耗时约一个月,大半时间耗在foobar2000sdk上,不得不说foobar2000是个糟糕的播放器平台,然而却找不到替代品。
foo_input_hybrid说明:(其源码其实可以适配任何ahc混合解码)
这是为平衡有损和无损音乐而创建的解码器包装。有损音乐听感接近于无损而有着更小的文件大小,从频谱上来看可以几无差别以致人无法区分。而无损音乐可以保存更好的音乐信息,音质更佳,但文件大小巨大。有些时候,我们既需要无损音乐也需要有损音乐,有损音乐适合移动设备的播放,无损音乐适合台式设备播放,同时存储有损和无损音乐是十分需要的。我们发现无损音频去掉其有损部分後可以压缩得更小,这与直接压缩相比所消耗的磁盘空间基本一致,大约多出5%,而有损音乐就占约30%。通过用两种压缩方式可以节省大量的磁盘空间,而本组件就是为了在附加无损音频存在的情况下,通过外包解码的方式还原原始音频。
foo_input_sfaad说明:faad2的foobar2000插件(有改动)。
sfaad说明:faad2的前端(有改动)。
【audio_hybrid说明】:简称ahc
有损无损混合编解码器,简称混合编解码器。
在foobar2000的转换器中,设置命令行参数如下:
faac:takc编码:%s %d -e faac -q 500 -c $f$ -o $d$ $s$ -ahc_ep takc -e -pMax $m$ $d:~0,-3$tak -ahc_ep sfaad $d$ $n$ -ahc_ep D:\
"D:\"是临时文件目录,ahc会将中间文件存放于此。
详细说明请看源码或运行ahc --help
foobar2000需要1.4以上版本,可以在foobar2000汉化网上下载 http://www.foobar2000.com.cn/
ahc需要配置编解码器目录,将盘符:\Program Files (x86)\foobar2000\encoders目录加到PATH环境变量即可。
【使用说明】:
用foobar2000安装两个插件,然後按图设置解码优先级。
命令行填faac:takc编码参数。
【功能测试及资源链接】:
功能测试:
一、faac:takc混合编码 44100Hz 16b 2ch
LACA-5713_utf8.cue LACA-5713.flac -> [wav] %album%/%title% [no]
多个文件CRC32校检:BCF7AB2A
1、混合编码,生成多音轨文件:
LACA-5713_utf8.cue LACA-5713.flac -> "CIRCUS - 初音島ベスト D.C.~ダ・カーポ~ベストセレクション.m4a" "CIRCUS - 初音島ベスト D.C.~ダ・カーポ~ベストセレクション.tak" [tag]
-> [wav] %album% cue/%title% [no] 多个文件CRC32校检:BCF7AB2A
2、混合编码,生成单文件:
LACA-5713.flac -> LACA-5713.m4a LACA-5713.tak [no]
+ cue -> [wav] %album% m4a/%title% [no] 多个文件CRC32校检:BCF7AB2A
二、qaac:takc混合编码 48000Hz 16b 2ch
BGM02A.wav -> reBGM02A.wav [no] CRC32校检:3E349033
混合编码失败,因为用sfaad解码qaac编码的音频会出现相位偏移
同样,fhgaac:takc混合编码等也是失败的,这得让sfaad能正确解码才行。
三、faac:takc混合编码 96000Hz 16b 2ch
"28. サウンドスケープ (TRUE & Wind Orchestra Ver.).flac" ->
"28. サウンドスケープ (TRUE & Wind Orchestra Ver.).wav" CRC32校检:2CA43297
-> "28. サウンドスケープ (TRUE & Wind Orchestra Ver.).m4a" +tak
-> "サウンドスケープ (TRUE & Wind Orchestra Ver.).wav" CRC32校检:2CA43297
综上所述,使用faac编码配合sfaad解码的混合编码方式是正确无误的。
相关资源:
链接:百度网盘
提取码:e2pn
所有代码都已开源,切忌用于商业用途。
2020年10月15日 14点10分 1
level 13
这个~~~很硬核喔,,不明觉厉
2020年10月16日 01点10分 3
level 1
牛逼!
700G最后转码完了体积有多少,上了AVX转的快吗
2020年10月16日 07点10分 4
比wvpack混合模式快,但体积略大。700G转码后还是700G因为是无损音乐,只是多了有损音乐。
2020年11月16日 11点11分
以后还打算优化算法,让压缩率与wavpack一样(之前少打了一个a),现在弄了foobar组合包可以直接使用。
2020年11月16日 11点11分
level 11
wavepack的有损压缩提升了高音,很不好。直接320k的qaac就完事了,听不太出来,体积才是flac的1/3。
2021年01月02日 10点01分 5
level 1
牛人[大拇指]
2021年07月23日 10点07分 6
level 13
[惊哭]这也太硬盒了
2021年07月24日 01点07分 7
level 1
直接320k的qaac就完事了,同意5楼的意见。
2025年01月01日 18点01分 8
level 6
搞那么多听得完吗[汗]
2025年02月11日 14点02分 9
level 6
我5000多首无损开始做筛选了,把感觉好听的留下来,因为太多听不完
2025年02月11日 14点02分 10
level 1
大哥,文件太多不知道要安装哪几个,还是全部安装
2025年12月24日 12点12分 11
1