decode - FLAC 音频格式中“每样本浪费的比特”的目的是什么?
问题描述
我正在研究实现一个 FLAC 解码器。我不清楚 SUBFRAME_HEADER规范的一部分。
<1+k> '浪费的比特/样本标志':
- 0:在源子块中没有浪费每个样本的比特,k=0
- 1:源子块中每样本浪费 k 个比特,随后是 k-1 个,一元编码;例如,k=3 => 001,k=7 => 0000001。
(这里的“<1+k>”表示字段/块的大小。)
这是规范中唯一提到k值的地方。它的目的是什么,应该如何解释?我认为“每个样本浪费的比特”这个术语不是很有意义。连字符对我来说意味着它不是指“浪费的比特”,而是指“每样本比特的浪费值”;但是,我不明白为什么这样的数量是有用的信息。
解决方案
某些文件格式(如 AIFF)将 14 位音频存储为用零填充的左对齐 16 位音频。FLAC 格式通过将样本大小(以比特为单位)设置为 16,但将浪费的比特设置为 2 来对此进行压缩。当子帧的每个样本的比特设置为 16 但浪费的比特设置为 2 时,子帧的其余部分将被解码为14 位,并且必须填充回 16 位。
换句话说,标志说:这个音频流说它的位深度为 16,但最低有效的 k 位到处都是 0,换句话说,它们没有被使用/浪费。因此,这个子帧被编码为 (16-k) 位,您必须添加 k 位填充才能恢复原始数据。
除了用于有效压缩将比特深度不是 8、16 或 24 位的样本填充到整个字节样本大小的音频之外,一些工具还使用它通过有选择地降低音频的比特深度来进行某种形式的有损压缩。一些 DVD-Audio 也可以做到这一点。有关更多信息,请参阅此论坛主题
推荐阅读
- c# - Entity Framework: Attaching an entity of type 'Country' failed because another entity of the same type already has the same primary key value
- vue.js - 使用 vue-ellipse-progress 组件,有什么方法可以让同一个圆圈有两种不同的颜色来表示高值和低值?
- javascript - 为什么easy-autcomplete不能在Rails 6上运行?
- java - 使用 Java Hibernate API 持久化实体,如果已存在则更新
- git - 如何使用来自 ansible 的 gitlab 部署令牌?
- c++ - 解析计算器的这段代码有什么问题?
- python - Eclipse Python Ubuntu 20.02
- flutter - Flutter pop 最佳实践
- python - 用python进行浮点精度显示
- wordpress - 在 Google 表格更新后更新 Wordpress 表格