这是Flac samples calculation的后续问题。
我是从文件的开头还是在流开始的元数据(here)之后实现该公式生成的偏移量?
我的目标是以编程方式自行划分文件 - 主要是作为学习练习。我的想法是,我会根据从图像中学习的值写下我的flac标题和元数据块,然后使用我的cuesheet从主图像中获取实际轨道。
目前在我的代码中,我可以解析每个元数据块并最终确定帧的开始位置。
答案 0 :(得分:1)
假设您尝试从M:S.F = 3:45.30
开始解码。每秒有75帧(CDDA扇区),显然每分钟有60秒。要将C:S.F从您的cue表转换为样本偏移值,我首先要计算所需起点的CDDA扇区数:(((60 * 3) + 45) * 75) + 30 = 16,905
。由于每秒有75个扇区,假设音频以44,100 Hz采样,每个扇区有44,100 / 75 = 588
个音频采样。因此,您将开始解码的所需音频样本偏移量为588 * 16,905 = 9,940,140
。
刚刚计算的偏移是解压缩的PCM样本的偏移量,而不是压缩的FLAC流(也不是字节)。因此,对于每个FLAC框架,计算它包含的样本数量并保持您的位置的运行记录。跳过FLAC帧,直到找到包含起始音频样本的帧。此时,您可以开始解码音频,丢弃您不需要的FLAC帧中的任何样本。
FLAC还支持SEEKTABLE
块,使用它会大大加快(和改变)我刚才描述的过程。如果您还没有,可以查看reference decoder的实现。