如何统一读取WAV与FLAC文件中的RIFF 'smpl'元数据?
统一读取WAV与FLAC里RIFF 'smpl'块数据的办法
问题情况
- WAV文件带有非官方的Sampler Chunk(即'smpl'块),用于音频循环播放器和采样器,避免重复加载多个样本
- 通过官方FLAC命令行工具执行
flac harmonica_1.wav --keep-foreign-metadata转换得到的FLAC文件,保留了该'smpl'元数据 - 已确认两类文件均存在该元数据,但使用sndfile-info、metaflac、exiftool等工具读取时,WAV与FLAC的输出格式不一致,需找到统一读取的方法
可行方案
1. 使用libsndfile的编程接口(C/Python绑定)
libsndfile原生支持读取WAV的'smpl'块,同时也能识别FLAC中通过--keep-foreign-metadata保留的RIFF元数据:
- 用C语言直接调用libsndfile的
sf_get_chunk()相关接口,提取'smpl'块的原始二进制数据后,自行解析为统一格式 - 用Python的
soundfile库(libsndfile的Python封装),通过soundfile.info()或底层接口获取块数据,再做标准化解析
2. 编写自定义脚本解析原始数据
- 针对WAV:直接定位RIFF结构中的'smpl'块,读取并解析其内容
- 针对FLAC:通过metaflac提取所有第三方元数据块(命令:
metaflac --list --block-type=VENDOR harmonica_1.flac),找到对应RIFF 'smpl'的二进制数据,再用与WAV一致的解析逻辑处理 - 编写通用解析函数,将两类文件提取到的'smpl'原始数据转换为统一输出格式(比如JSON结构)
3. 用ffmpeg提取并标准化输出
ffmpeg可识别WAV的'smpl'块,也能读取FLAC中保留的该元数据,通过指定输出格式实现统一结果:
- 命令示例(提取后输出便于整理的内容):
后续可通过脚本将输出整理为统一格式# 处理WAV文件 ffmpeg -i harmonica_1.wav -f ffmetadata - | grep -A20 smpl # 处理FLAC文件 ffmpeg -i harmonica_1.flac -f ffmetadata - | grep -A20 smpl
注意事项
- 尽量使用较新版本的工具,比如libsndfile ≥1.0.30、ffmpeg ≥4.0,对FLAC中的RIFF元数据支持更完善
- 自定义解析时,需严格遵循RIFF 'smpl'块的格式规范,避免解析错误
内容的提问来源于stack exchange,提问作者Kim T
相关产品推荐
相关产品推荐

