На самом деле говорит вводит дополнительную задержку для аудиоданных, я обнаружил путем обратной инженерии:
narrow band : delay = 200 - framesize + lookahead = 200 - 160 + 40 = 80 samples
wide band : delay = 400 - framesize + lookahead = 400 - 320 + 143 = 223 samples
uwide band : delay = 800 - framesize + lookahead = 800 - 640 + 349 = 509 samples
Так как прогнозирование инициализируется с помощью Zereos, вы наблюдаете, что первые несколько образцов "близки к нулю".
Чтобы правильно выбрать время, вы должны пропустить эти сэмплы, прежде чем вы получите фактические аудиоданные, которые вы ввели в кодек. Почему это, я не знаю. Probalby, автор speex, никогда не заботился об этом, поскольку speex предназначен для потоковой передачи, а не для хранения и восстановления аудиоданных.
Другой обходной путь (чтобы не тратить пространство) состоит в том, что вы вводите нули (frameize-delay) в кодек перед подачей реальных аудиоданных, а затем отбрасываете весь первый speex-кадр.
Надеюсь, это все прояснит. Если кто-то, знакомый с Speex, прочитает это, не стесняйтесь поправлять меня, если я ошибаюсь.
РЕДАКТИРОВАТЬ: На самом деле, декодер и кодер имеют время ожидания. Фактическая формула для задержки:
narrow band : delay = decoder_lh + encoder_lh = 40 + 40 = 80 samples
wide band : delay = decoder_lh + encoder_lh = 80 + 143 = 223 samples
uwide band : delay = decoder_lh + encoder_lh = 160 + 349 = 509 samples