Предположим, вы пытаетесь декодировать, начиная с M:S.F = 3:45.30
.75 кадров (секторов CDDA) в секунду и, очевидно, 60 минут в минуту.Чтобы преобразовать M: SF из вашего контрольного листа в значение смещения образца, я сначала вычислю количество секторов CDDA до желаемой начальной точки: (((60 * 3) + 45) * 75) + 30 = 16,905
.Поскольку имеется 75 секторов в секунду, при условии, что аудио дискретизируется с частотой 44 100 Гц, в каждом секторе имеется 44,100 / 75 = 588
аудио выборок.Таким образом, желаемое смещение аудиосэмпла, с которого вы начнете декодировать, равно 588 * 16,905 = 9,940,140
.
. Только что рассчитанное смещение является смещением в распакованные выборки PCM, а не в сжатый поток FLAC (или в байтах).Поэтому для каждого кадра FLAC рассчитайте количество отсчетов, которые он содержит, и продолжайте подсчет вашей позиции.Пропускайте кадры FLAC до тех пор, пока не найдете тот, который содержит исходный аудиосэмпл.В этот момент вы можете начать декодирование звука, отбрасывая любые сэмплы в кадре FLAC, которые вам не нужны.
FLAC также поддерживает блок SEEKTABLE
, использование которого значительно ускорит (иизменить) процесс, который я только что описал.Если вы еще этого не сделали, вы можете посмотреть на реализацию эталонного декодера .