Я пытаюсь написать звуковой ресемплер, используя пакет Android MediaCodec.
В настоящее время я загружаю стереофонический аудиофайл MP3 в MediaExtractor, который затем декодируется MediaCodec. Частота дискретизации исходного аудио составляет 48000.
Чего я не понимаю, так это первых четырех выходных буферов, которые я получаю от декодера:
- размер 0, время 0
- размер 0, время 24000
- размер 4312, время 48000
- размер 4608, время 72000
- размер 4608, время 96000
- и т.п.
Из этот ответ, этот ответ и эту статью , я считаю, что первые два буфера просто распространяют «задержку кодировщика» и могут быть просто выброшены. Однако третий буфер, который я перечислил, ставит меня в тупик.
Для буфера № 4 (и далее) математика работает так:
((4608 bytes) / (2 bytes/sample) / (2 channels))
/ ((48,000 samples/sec) / (1,000,000 us/sec))
= 24,000 us (i.e. the change in time between buffers)
Что происходит с буфером № 3? Прямой взгляд на данные показывает, что звук начинает воспроизводиться во время 48000 мкс, а затем на мгновение останавливается перед отметкой 72000 мкс, после чего он начинает воспроизводиться непрерывно без перерывов.
Кажется более вероятным, что перед данными буфера № 3 есть 296 скрытых нулей, но это смещение, похоже, не указывается никакими переменными в моем коде. Может ли кто-нибудь пролить свет на это для меня?